MySQL触发+具有多个数据库的复制
时间:2020-03-06 14:24:09 来源:igfitidea点击:
我正在MySQL 5.0.45上运行几个数据库,并试图使我的旧数据库与修订后的架构同步,因此我可以同时运行。我通过向新数据库添加触发器来做到这一点,但是我遇到了复制问题。我的设置如下。
服务器"主"
- 数据库" legacydb",复制到服务器"从属"。
- 数据库" newdb"具有用于更新" legacydb"且不进行复制的触发器。
服务器"从属"
- 数据库" legacydb"
我对" newdb"的更新运行良好,并触发了我的触发器。他们在"主"服务器上更新" legacydb"。但是,更改不会向下复制到从站。 MySQL文档说,为简单起见,复制在确定要复制的查询时会查看当前的数据库上下文(例如" SELECT DATABASE();"),而不是查看查询的结果。我的触发器是从数据库" newdb"的上下文运行的,因此复制将忽略更新。
我尝试将更新语句移动到" legacydb"中的存储过程。当我连接到" master"并手动运行"" USE newdb; CALL legacydb.do_update('Foobar',1,2,3,4);"时,这可以很好地工作(即数据复制到从属服务器)。但是,从触发器调用此过程时,它不会复制。
到目前为止,我对如何解决此问题的思考只是以下一种。
- 强制触发器设置新的当前数据库。这将是最简单的,但是我认为这是不可能的。这是我希望通过存储过程实现的目标。
- 复制两个数据库,并在主数据库和从数据库中都有触发器。这是可能的,但要建立起来很麻烦。
- 强制复制以选择对" legacydb"的所有更改,而不管当前数据库的上下文如何。
- 如果复制运行的级别过高,它甚至不会看到触发器触发的任何更新,在这种情况下,没有任何黑客手段可以实现我想要的功能。
对于如何实现这一目标的任何帮助将不胜感激。
解决方案
这可能与它有关:
存储的函数在执行之前获取表锁,以避免二进制日志中由于语句执行顺序和语句出现在日志中的顺序不匹配而导致不一致。记录调用函数的语句,而不是记录在函数内执行的语句。因此,更新相同基础表的存储函数不会并行执行。
相反,存储过程不获取表级锁。在存储过程中执行的所有语句都将写入二进制日志。
此外,还有触发器的完整问题列表:
http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html