【问题标题】:MySQL Trigger & Stored Procedure ReplicationMySQL 触发器和存储过程复制
【发布时间】:2008-09-18 15:50:30
【问题描述】:
好的,我正在运行一个具有单个主设备和多个从设备的设置。所有写入都通过主服务器并被复制到严格用于读取的从服务器。
现在我有一个存储过程(不是函数),它由插入时的触发器调用。根据 MySQL 文档,对于复制触发器,记录对触发器的调用,而存储过程实际记录存储过程的结果。
所以我的问题是,当我的触发器被触发时,它是否会复制触发器和触发器调用的过程的结果(导致过程有效地运行两次)?还是会简单地复制触发器,让从属设备自己重新运行存储过程?
谢谢
【问题讨论】:
标签:
mysql
stored-procedures
triggers
【解决方案1】:
在 MySQL 5.0(和基于语句的二进制日志记录的 MySQL 5.1)中,仅记录调用查询,因此在您的情况下,将记录 INSERT。
在从机上,INSERT 将被执行,然后触发器将在从机上重新运行。所以触发器需要存在于slave上,假设它存在,那么它将以与master完全相同的方式执行。
在 MySQL 5.1 中,有基于行的二进制日志记录,它只会记录被更改的行,因此触发器不会在从属设备上重新触发,但所有更改的行仍会传播。
【解决方案2】:
除了哈里森的出色回答:
- 假设数据库一开始是同步的(架构、数据、相同版本),它应该可以正常工作
- 如果不是,则可能是您在查询或触发器中使用了不确定的东西。解决这个问题。
- 无论您如何使用复制,您都需要进行监控以检查从属服务器是否始终保持同步。如果没有任何监控,它们会(微妙地)变得不同步,您不会注意到。 MySQL 没有自动检查或修复它的内置功能。