我正在尝试使用MySQL Replication Listener Library在HostA和HostB之间进行数据复制。
复制基于基于行的非语句。我知道MySQL本身有这样的内置功能,但我想自己做 - 从HostA的bin日志中读取所有行更改并将所有这些更改应用到HostB。
我遇到的问题是,我无法暂时禁用触发器,这会导致数据不同步。
举个例子,假设要同步的数据库是 TestSyncDB ,其中有两个表是Data和DataOp。 Data表有一个触发器,一旦将记录插入该表,触发器将为DataOp生成一条新记录。
现在新的记录被插入到HostA.TestSyncDB.Data中,因为有一个触发器,所以实际上会有两条记录添加到数据库中,复制侦听器库会向我返回两个查询,例如: / p>
问题是如果我将这两个查询重播到 HostB , HostA.TestSyncDB 中的表格中会添加三个新记录,因为触发器。然后数据永远不会发生。
那么如何解决这个问题?有可能暂时禁用触发器吗?如果没有,如何像MySQL Replication一样正确地做到这一点?
答案 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 format和Advantages and Disadvantages
答案 1 :(得分:0)
我认为你不能在MySQL中禁用触发器
但你可能会找到一个解决方案:
mysql-disable-all-triggers
我个人只是将触发器放在HostB上,然后我觉得重放基于ROW的二进制日志应该不是问题。