MySQL 触发器 + 具有多个数据库的复制

MySQL triggers + replication with multiple databases

提问人:Josh 提问时间:9/19/2008 最后编辑:Josh 更新时间:9/19/2008 访问量:4824

问:

我在 MySQL 5.0.45 上运行了几个数据库,并试图让我的旧数据库与修改后的架构同步,这样我就可以并排运行这两个数据库。我通过向新数据库添加触发器来执行此操作,但我遇到了复制问题。我的设置如下。

服务器“master”

  • 数据库“legacydb”,复制到服务器“slave”。
  • 数据库“newdb”具有更新“legacydb”的触发器,并且没有复制。

服务器“从属”

  • 数据库“legacydb”

我对“newdb”的更新运行良好,并触发了我的触发器。它们在“master”服务器上更新“legacydb”。但是,这些更改不会复制到从属设备。MySQL文档说,为简单起见,复制着眼于当前的数据库上下文(例如 ) 时,在决定要复制哪些查询时,而不是查看查询的乘积。我的触发器是从数据库“newdb”的上下文中运行的,因此复制会忽略更新。"SELECT DATABASE();"

我尝试将更新语句移动到“legacydb”中的存储过程。当我连接到“master”并手动运行时,这工作正常(即数据复制到从属服务器)。但是,当从触发器调用此过程时,它不会复制。"USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);"

到目前为止,我对如何解决这个问题的想法是以下之一。

  • 强制触发器设置新的当前数据库。这将是最简单的,但我认为这是不可能的。这就是我希望通过存储过程实现的目标。

  • 复制两个数据库,并在主数据库和从数据库中都有触发器。这是可能的,但设置起来很痛苦。

  • 强制复制选取对“legacydb”的所有更改,而不考虑当前数据库上下文。

  • 如果复制运行的级别太高,它甚至永远不会看到我的触发器运行的任何更新,在这种情况下,再多的黑客攻击也无法实现我想要的。

关于如何实现这一目标的任何帮助将不胜感激。

MySQL 触发复制

评论


答:

3赞 Chris 9/19/2008 #1

这可能与它有关:

存储函数在执行之前获取表锁,以避免由于语句的执行顺序和它们在日志中的出现顺序不匹配而导致二进制日志中的不一致。将记录调用函数的语句,而不是在函数中执行的语句。因此,更新相同基础表的存储函数不会并行执行。

相反,存储过程不获取表级锁。在存储过程中执行的所有语句都将写入二进制日志。

此外,触发器还有一整套问题:http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

评论

0赞 Chris 9/19/2008
基本上,万无一失的方法是更新数据库,如果复制的数据库中有触发器或存储的函数,它们也必须存在于从属数据库中。在如何编写触发器和函数以使其自身复制方面也有限制。