代码之家  ›  专栏  ›  技术社区  ›  Josh

mysql触发器+多数据库复制

  •  4
  • Josh  · 技术社区  · 16 年前

    我在MySQL5.0.45上运行了几个数据库,并试图让我的旧数据库与修改后的模式同步,这样我就可以同时运行这两个数据库。我是通过向新数据库添加触发器来实现这一点的,但是我在复制方面遇到了问题。我的设置如下。

    服务器“主”

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

    服务器“从机”

    • 数据库“legacydb”

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

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

    到目前为止,我一直在思考如何解决这个问题。

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

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

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

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

    对于如何实现这一目标的任何帮助都将非常感谢。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Chris    16 年前

    这可能与此有关:

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

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

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