2008-09-19 27 views
4

我在MySQL 5.0.45上运行几个数据库,并试图让我的遗留数据库与修订的模式同步,所以我可以并排运行。我正在通过向新数据库添加触发器来实现这一点,但我遇到了复制问题。我的设置如下。MySQL触发器+复制与多个数据库

服务器的 “主人”

  • 数据库 “legacydb”,复制到服务器的 “奴隶”。
  • 数据库“newdb”,触发器更新“legacydb”并且不复制。

服务器 “奴隶”

  • 数据库 “legacydb”

我的更新 “NEWDB” 运行良好,并掀起我的触发器。他们更新“主”服务器上的“legacydb”。但是,这些更改不会复制到奴隶身上。 MySQL文档说,为了简单起见,在决定要复制哪些查询而不是查看查询产品时,复制会查看当前数据库上下文(例如"SELECT DATABASE();")。我的触发器是从数据库“newdb”的上下文运行的,因此复制会忽略更新。

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

到目前为止,我对如何解决这个问题的思考一直是下列问题之一。

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

  • 复制这两个数据库,并且在主站和从站中都有触发器。这将是可能的,但一个痛苦的设立。

  • 无论当前的数据库上下文如何,强制复制都会选取“legacydb”的所有更改。

  • 如果复制的运行水平太高,它甚至不会看到我的触发器运行的任何更新,在这种情况下,没有任何黑客攻击会达到我想要的效果。

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

回答

3

这可能是与它:

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

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

此外,还有一些问题整个列表使用触发器: http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

+0

基本上,万无一失的办法是更新数据库,如果有触发复制的数据库,或存储功能,他们也必须存在在从数据库上。对于如何编写触发器和函数还有一些限制,以便它们自己复制。 – Chris 2008-09-19 03:37:23