首页 > 解决方案 > Mysql Db 同步选项

问题描述

关于 MySQL 复制的问题(主要)。

所以我有 2 个 MySQL 数据库,它们是相同的模式,但没有通过任何类型的网络连接。我需要单向(仅)同步数据,即 Db1 始终需要复制/转储下来,并与 Db2 同步。两者都有更新/插入/删除活动。

我已确保 DB2(它始终是接收器)具有非常高范围内的序列 - 因此在 DB2 上创建或“拥有”的记录在同步时不会与 DB1 记录冲突。还有一条规则是,在 DB2 上,我们不会编辑在 DB1 上创建的任何数据(我们可以通过序列号来判断,也可以通过每个 DB 上输入的数据类型来判断)。

我已经通过 mysqldump(来自 Db1)进行了这项工作,并将转储修改为“REPLACE INTO”而不是“INSERT into”——并将这个修改后的 mysqldump-output 作为 SQL 脚本运行。音量不太高,效果很好。

是否可以通过复制来做到这一点(足够简单)。Mysql 可以创建快照转储,我会复制它们并运行复制命令 - 是否可行。

标签: mysqlreplicationdatabase-replication

解决方案


  1. 我会使用auto_increment_increment&auto_increment_offset来确保记录不重叠。我知道您说过您将 DB2 上的记录设置为较高的范围,但最终它们可能仍会重叠。只是让 DB1 使用奇数值而 DB2 使用偶数值就可以确保永远不会发生这种情况。

  2. 如果两个实例未通过网络连接,则不能使用复制。复制要求副本能够与其主服务器建立连接。

  3. 但是您可以使用二进制日志,这是复制工作方式的一部分。在 DB1 上,启用二进制日志记录,它将记录对数据库所做的每一次更改。定期将这些日志复制到 DB2 的服务器(如果您当前正在使用 mysqldump,我假设您有一些方法可以做到这一点)。使用该mysqlbinlog工具将日志转换为 SQL 命令以针对您的 DB2 实例进行回放。

    例子:

     mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
    
  4. 您可以跟踪您已复制和执行的二进制日志。就在您复制一组 binlog 文件之前,FLUSH LOGS在 DB1 上运行。这会导致 DB1 关闭它当前正在写入的 binlog 文件,并打开一个新的 binlog 文件。这样您就可以一次处理整个文件,而不必担心部分文件。


推荐阅读