我正在尝试使用 MySQL Replication Listener Library在 HostA 和 HostB 之间做数据复制。
复制基于行而非语句。我知道 MySQL 本身有这样的内置功能,但我想自己做 --- 从 HostA 的 bin 日志中读取所有行更改并将所有这些更改应用到 HostB。
我遇到的问题是,我无法暂时禁用触发器,这会导致数据不同步。
举个例子,假设要同步的数据库是TestSyncDB,里面有两个表Data和DataOp。数据表有一个触发器,一旦一条记录插入到该表中,触发器就会为 DataOp 生成一条新记录。
现在一条新记录被插入到 HostA.TestSyncDB.Data 中,因为有一个触发器,所以实际上会有两条记录被添加到数据库中,复制监听器库将返回给我两个查询,比如:
- 插入 HostA.TestSyncDB.Data 值 (...)
- 插入 HostA.TestSyncDB.DataOp 值 (...)//通过触发器
问题是,如果我将这两个查询重播到 HostB,将会有 三个 新记录添加到 HostA.TestSyncDB 的表中,因为触发器。然后数据永远不会正确。
那么如何解决呢?是否可以暂时禁用触发器?如果没有,如何像 MySQL Replication 一样正确地执行它?
最佳答案
在 mysql 复制中,当您在 master 上创建触发器时,它将在 slave 上创建。所以如果你想在从机上使用不同的触发器,你可以编辑那个触发器,或者如果你不想的话可以删除。
对于 relication 格式,如果您的 master 的 binlog binlog_format = ROW
,它将像 master 一样复制,如果 slave 想要与 master 不同的触发操作,则它不适合触发器作为您的情况。在这种情况下,binlog 需要基于 binlog_format = STATEMENT
的语句。那么在mysql中是否可以根据需要切换这两个。
所以这里的关键点是你需要 binlog_format = MIXED
。决定何时使用基于 STATEMENT
以及何时使用基于 ROW
是足够聪明的。对于这种情况,它将被视为 STATEMENT BASED
。否则它将以 ROW BASED
的形式工作。
你可以在这里阅读更多- replication format和 Advantages and Disadvantages
关于mysql - 自己做MySQL行复制的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763735/