mysql - 自己做MySQL行复制的问题

标签 mysql database synchronization replication

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

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

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

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

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

  1. 插入 HostA.TestSyncDB.Data 值 (...)
  2. 插入 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 formatAdvantages and Disadvantages

关于mysql - 自己做MySQL行复制的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32763735/

相关文章:

mysql - 在没有 native 查询的情况下在 JPA 中更新

mysql - 扩展数据库以进行群组/协作消息传递

java - 如何使用相同的 ResultSet 填充 2 个 CachedRowSet?

c - 与子信号和父信号同步将接收到的信号与文件进行匹配

java - 使用volatile和synchronized时flushed或者publish到各个线程的内存范围是多少?

php - 存储数据的最佳方式

php - "mysql_num_rows expects parameter 1 to be resource"查询时出错

mysql - DBUnit 如何设置属性来测试在 Docker 容器中运行的数据库

SQL 服务器 : Update reporting table in real time

java - 如何在Tomcat集群中同步配置文件?