【问题标题】:MySQL: How to update remote webserver with differential dataMySQL:如何使用差异数据更新远程 Web 服务器
【发布时间】:2013-02-21 19:18:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: mysql mysql-python database-replication


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您不能混合和匹配来自不同 MySQL 实例的增量物理备份。我提供的 binlog 解决方案会做同样的事情,但作为独立于物理实例的逻辑备份。
    • 无论你怎么做,你都需要一些方法来记住你上次同步时当前的 binlog 文件和位置。使用 FLUSH LOGS 会更容易一些,因为这样您就可以处理整个 binlog 文件,而不必记住 binlog 文件中的偏移量。
    • 不适用于指定表,但可以根据数据库过滤bin日志。有一些细微差别,请阅读dev.mysql.com/doc/refman/5.5/en/…
    • 不,我不认为您可以在回复时更改 binlog 中的操作以应用于不同的数据库名称。我的意思是你可以通过编辑 mysqlbinlog 的输出来破解它,但这很难做到。
    • 不是一个简单的方法,不......我最好的建议是保留原始数据库的副本并使用pt-table-sync 来区分它们。您可以使用--print 选项报告差异,而不是对其采取行动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2020-06-02
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多