【问题标题】:Problems In Doing MySQL Row-Based Replication By Myself自己进行基于行的 MySQL 复制的问题
【发布时间】:2015-09-24 14:17:01
【问题描述】:

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

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

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

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

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

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

问题是,如果我将这两个查询重播到 HostBHostA.TestSyncDB 中的表中会添加 三个 新记录,因为触发器。那么数据永远不会是正确的。

那么如何解决呢?是否可以暂时禁用触发器?如果没有,如何像 MySQL Replication 一样正确地做到这一点?

【问题讨论】:

    标签: mysql database synchronization replication


    【解决方案1】:

    在 mysql 复制中,当您在 master 上创建触发器时,它将在 slave 上创建。因此,如果您想在从属设备上使用不同的触发器,您可以编辑该触发器或在不需要时删除。 对于 replication 格式,如果您的 master 的 binlog binlog_format = ROW,它将复制为 master done,如果 slave 想要不同的触发操作,则它不适合触发器,然后 master 作为您的情况。在这种情况下,binlog 需要基于binlog_format = STATEMENT 的语句。那么在mysql中是否可以根据需要切换这两者。

    所以这里的关键点是你需要binlog_format = MIXED。决定何时使用基于STATEMENT 以及何时使用基于ROW 是足够聪明的。对于这种情况,它将被视为STATEMENT BASED。否则它将作为ROW BASED 工作。

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

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2011-11-02
      • 2011-03-11
      相关资源
      最近更新 更多