代码之家  ›  专栏  ›  技术社区  ›  Streamline

导入从源中排除表的数据库mysqldump会将表保留在目标中吗?

  •  0
  • Streamline  · 技术社区  · 4 年前

    移动数据库( db1 )从一个服务器到另一个服务器,只有一个表( big_table )这是如此之大,以至于导入到目标需要比我们首选的维护窗口更长的时间,因此我们在目标继续导入时保持应用程序与源数据库服务器通信。

    现在,我们要重做这个过程,以通过两个步骤获得已更改的内容:

    1. big_表 并确保在导入时不会覆盖或删除目标中已经存在的非常大的表
    2. 从中转储新的/更新的记录 big_表 并将这些增量记录导入现有目标 db.big_table

    对于第一步,这会起到保护作用吗 db1 db。big_表

    mysqldump -h host1 db1 --ignore-table=db1.big_table --no-create-db | mysql -h host2 db1
    

    对于第二步,如果我知道中没有更新,只有新记录 big_表

    mysqldump -h host1 db1 big_table --no-create-info --where "timestamp > '${LAST_EXPORTED_TIMESTAMP}'" | mysql -h host2 db1
    

    我试图了解,自从第一次导入到目标后,这些“补丁”尝试在源代码中更改是否都没有尝试删除/创建 db1 db1.big_table big_表 big_表 自已知时间戳。

    1 回复  |  直到 4 年前
        1
  •  0
  •   dogs Cute    4 年前

    mysqldump没有一个表(big_table)那么大;

        2
  •  0
  •   Bill Karwin    4 年前

    更好的方法是使用MySQL复制。

    1. 将新服务器配置为旧服务器及其源的副本。

    2. 开始复制,让所有表的所有更改复制到新服务器,直到全部完成。这可能需要几分钟到几小时,但不管需要多长时间,因为在同步过程中,应用程序仍应使用旧服务器。

    3. 拿一个 非常简短 中断以切换应用程序以使用新服务器。如果你的流量非常繁忙,在让应用程序使用它进行读写流量之前,你可能需要额外确保它完全被占用。但这可能只需要几秒钟。

        3
  •  0
  •   Streamline    4 年前

    我原本计划忽略 big_table 只需从 然后写了一个文件并检查了结果,只是为了确保没有任何语句会导致任何创建、删除或其他我不想要的地方和时间。我还准备了一份 /var/lib/mysql

    我采取的这种“追赶”方式只需要停止应用程序一小段时间,即使最初的导入尝试包括完整的 花费了相当长的时间(小时)。

    • db1 通过重做完全转储(省略时不会花费太多时间 big_表 因为与之相比,其他一切都很小)并使用 --no-create-db :
      mysqldump -h host1 db1 --ignore-table=db1.big_table --no-create-db | mysql -h host2 db1
      

    big_表

    • 获取目标中的最后一个id:
      mysql -h host2 -ve "SELECT id FROM db1.big_table ORDER BY id DESC LIMIT 1"
      
    • 然后提取并仅将新记录从源加载到目标(假设 id 4567890)并使用 --no-create-info
      mysqldump -h host1 db1 big_table --no-create-info --where "id > 4567890" | mysql -h host2 db1
      

    它工作得很好,完成了我需要的工作和用例。如果要再次这样做,或者使用一个更复杂的带有更新的表,而不是只有新记录或多个这样大的表,我可能会研究Bill提出的使用复制的路径,让mysql来完成繁重的工作。