自己做MySQL行复制的问题

时间:2015-09-24 14:17:02

标签: mysql database synchronization replication

我正在尝试使用MySQL Replication Listener Library在HostA和HostB之间进行数据复制。

复制基于基于行的非语句。我知道MySQL本身有这样的内置功能,但我想自己做 - 从HostA的bin日志中读取所有行更改并将所有这些更改应用到HostB。

我遇到的问题是,我无法暂时禁用触发器,这会导致数据不同步。

举个例子,假设要同步的数据库是 TestSyncDB ,其中有两个表是Data和DataOp。 Data表有一个触发器,一旦将记录插入该表,触发器将为DataOp生成一条新记录。

现在新的记录被插入到HostA.TestSyncDB.Data中,因为有一个触发器,所以实际上会有两条记录添加到数据库中,复制侦听器库会向我返回两个查询,例如: / p>

  1. 插入HostA.TestSyncDB.Data值(...)
  2. 通过触发器
  3. 插入HostA.TestSyncDB.DataOp值(...)//

    问题是如果我将这两个查询重播到 HostB HostA.TestSyncDB 中的表格中会添加三个新记录,因为触发器。然后数据永远不会发生。

    那么如何解决这个问题?有可能暂时禁用触发器吗?如果没有,如何像MySQL Replication一样正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

在mysql复制中,当您在master上创建触发器时,它将在slave上创建。因此,如果你想在奴隶上使用不同的触发器,你可以编辑那个触发器或者如果你不想要的话。 对于relication格式,如果你的主人的binlog binlog_format = ROW,它将复制为master done,如果slave需要不同的触发器操作然后掌握你的情况,它不适合触发器。在这种情况下,binlog需要基于binlog_format = STATEMENT的语句。所以在mysql中可以根据需要切换b / w这两个。

这里的关键点是你需要binlog_format = MIXED。它足够聪明,可以决定何时使用STATEMENT以及何时使用ROW。对于这种情况,它将作为STATEMENT BASED处理。其他方面,它将作为ROW BASED

你可以在这里阅读更多 - replication formatAdvantages and Disadvantages

答案 1 :(得分:0)

我认为你不能在MySQL中禁用触发器 但你可能会找到一个解决方案:
mysql-disable-all-triggers

我个人只是将触发器放在HostB上,然后我觉得重放基于ROW的二进制日志应该不是问题。