1

在我的本地机器上,我维护了几个 InnoDB 表,它们是我的 Web 服务器上的表的镜像副本。每当我有新的或更新的数据时,我都会在本地表上执行。对于更新,通常只针对某些表的几个字段。在本地执行有助于我在暂存前执行数据处理和验证。最后,我想将这些差异数据移动到远程服务器。

我怎样才能最好地完成数据迁移的整个过程。我正在寻找您的意见/经验的几个阶段:

  • 从所有表中识别和获取差异数据的命令,
  • 在远程站点上,使用此数据更新相应表的命令,
  • 如何确保更新的原子性不会破坏用它创建的网页内容的完整性。

我计划将整个过程自动化。将来,可能会有 1000 次这样的更新,因此我希望优化这个时间和大小。

我使用python并计划使用fabric来运行命令。

4

1 回答 1

1

我会尝试使用二进制日志来记录对本地数据库的更改。然后,您只需使用mysqlbinlog工具将二进制日志转换为 SQL 脚本,并将其应用到您的网站。与执行时间点恢复的过程类似。

将本地二进制日志转换为 SQL 后,在本地系统上使用FLUSH LOGS(或mysqladmin flush-logs )。这样您就可以准确地知道从哪里停下来,并且可以在下次上传更改时从那里开始。

我不确定以真正原子的方式在 Web 服务器上应用更改。你必须使用交易来做到这一点。您可以将 SQL 脚本夹在 START TRANSACTION 和 COMMIT 之间,但我想确保 binlog 本身不包含事务语句。

另一个比较两个数据库并找出最小更改集的工具是 Percona Toolkit 的pt-table-sync。但该工具通常旨在使数据库相同。您的 Web 服务器上可能有不在本地开发人员实例中的生产数据,因此您可能需要过滤到特定表,或者 pt-table-sync 可能具有“插入但不删除”选项或其他内容。我鼓励您仔细阅读文档并在测试实例上进行实验。

于 2013-02-21T21:30:05.733 回答