我自己做MySQL行复制时遇到的问题

我自己做MySQL行复制时遇到的问题,mysql,database,synchronization,replication,Mysql,Database,Synchronization,Replication,我正在尝试使用在主机A和主机B之间进行数据复制 复制基于行而不是语句。我知道MySQL本身有这样的内置功能,但我想自己做——从HostA的bin日志中读取所有行更改,并将所有这些更改应用到HostB 我遇到的问题是,我无法暂时禁用触发器,这将导致数据不同步 例如,假设要同步的数据库是TestSyncDB,其中有两个表,分别是Data和DataOp。数据表带有一个触发器,一旦将一条记录插入该表中,触发器将生成一条新的记录到DataOp 现在在HostA.TestSyncDB.Data中插入了一条新

我正在尝试使用在主机A和主机B之间进行数据复制

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

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

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

现在在HostA.TestSyncDB.Data中插入了一条新记录,因为有一个触发器,所以实际上将有两条记录添加到数据库中,复制侦听器库将向我返回两个查询,类似于:

  • 插入HostA.TestSyncDB.Data值(…)
  • 通过触发器插入HostA.TestSyncDB.DataOp值(…)//中
  • 问题是,如果我将这两个查询重放到HostB,由于触发器的原因,HostA.TestSyncDB中的表将添加三条新记录。然后数据永远不会正确


    那么如何解决这个问题呢?是否可以暂时禁用触发器?如果没有,如何像MySQL复制那样正确地执行它?

    在MySQL复制中,当您在主服务器上创建触发器时,它将在从服务器上创建。所以,如果您想在从属服务器上使用不同的触发器,您可以编辑该触发器,如果您不想,可以删除该触发器。 对于relation格式,如果您的主机的binlog
    binlog\u format=ROW
    ,它将作为主机完成复制,它不适合于触发器如果从机需要不同的触发器操作,则根据您的情况进行主控。在这种情况下,binlog需要基于语句的
    binlog\u format=statement
    。因此,在mysql中,是否可以根据需要切换这两种模式

    所以这里的关键点是您需要
    binlog\u format=MIXED
    。它足够聪明,可以决定何时使用基于
    语句的
    ,何时使用基于
    行的
    。对于这种情况,它将被视为基于
    语句的
    。其他方面,它将作为基于行的
    工作

    你可以在这里阅读更多- 及