繁体   English   中英

导入从源中排除表的数据库 mysqldump 是否会保留目标中的表?

[英]Will importing a database mysqldump that excludes a table from source preserve the table in destination?

将数据库 ( db1 ) 从一台服务器移动到另一台服务器,并且有一个表 ( big_table ) 如此之大,以至于导入目标所需的时间比我们首选的维护 window 所以我们保持应用程序与源数据库服务器通信,而目的地继续进口。

现在我们要重做该过程以通过两个步骤获取更改的内容:

  1. 从源中转储除big_table之外的所有表,并确保在导入时不会覆盖或删除目标中已经存在的非常大的表
  2. 自上次时间戳以来从big_table转储新的/更新的记录,并将这些增量记录导入现有的目标db.big_table

对于第一步,这是否可以在重新创建所有其他表时保留目标中的db1db.big_table

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

对于第二步,如果我知道自已知时间戳以来big_table中没有更新且只有新记录,这会起作用吗?

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

我试图了解自第一次导入目标以来对源更改的这些“补丁”尝试中的每一个是否都没有尝试删除/创建db1db1.big_table而是仅捕获和导入除big_table之外的所有表和仅新记录在big_table中,因为一个已知的时间戳。

有没有比我起草的更好的方法来做到这一点?

mysqldump 没有一张那么大的表(big_table);
你可以使用 meb 或 xtrabackup

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

  1. 对源实例进行完整备份。 您可以使用 mysqldump,但使用像 Percona XtraBackup 这样的物理备份工具会更快。 确保在备份时捕获二进制日志坐标(在 XtraBackup 中默认启用)。

  2. 将备份还原到新服务器。 在此过程中,您的应用程序可能会继续使用旧服务器。

  3. 将新服务器配置为旧服务器的副本,即其源。

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

  5. 采取非常短暂的中断来切换应用程序以使用新服务器。 如果您的流量非常繁忙,您可能希望在让应用程序将其用于读写流量之前特别确保它已完全赶上。 但这很可能只需要几秒钟。

尽管比尔提出的不同路径是从头到尾利用内置复制的更优雅的解决方案,但我正在回答实际问题,即是否已经开始尝试从源迁移到目标(使用 mysqldump 和定向输出)并尝试使用从源头开始的更改来修补(选择性地重做)它,我能否确保不会覆盖或删除已经在目的地的大表。

我最初计划尝试忽略big_table并只执行big_table中的行并写入文件并检查结果,以确保没有任何语句会导致任何创建、删除或其他我没有在何时何地创建想要它。 为了确定,我还准备了目标的/var/lib/mysql的备份副本。

我为这个“追赶”采取的路径只需要停止应用程序一小段时间,即使包含完整big_table的原始导入尝试花费了相当长的时间(小时)。

  • 通过重做完整转储来更新主db1数据库(省略big_table时这并没有花费太多时间,因为相比之下其他所有内容都很小):
     mysqldump -h host1 db1 --ignore-table=db1.big_table --no-create-db | mysql -h host2 db1

因为我知道big_table中没有更新,只有新记录(重要的区别在于这很简单,因为不需要更新)并且 id 是增量的,我能够:

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

它运行良好,完成了我在这项工作和用例中所需要的。 如果要再次执行此操作,或者使用更复杂的表进行更新,而不是仅使用新记录或多个像这样非常大的表,我可能会调查 Bill 提出的使用复制的路径,并让 mysql 完成繁重的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM