使用基于语句的复制,在源上执行的触发器也会在副本上执行。使用基于行的复制,在源上执行的触发器不会在副本上执行。相反,由于触发器执行而导致的源上的行更改将被复制并应用于副本。
这种行为是经过设计的。如果在基于行的复制下,副本应用了触发器以及由触发器引起的行更改,那么这些更改实际上会在副本上应用两次,从而导致源和副本上的数据不同。
如果希望触发器同时在源和副本上执行,可能是因为源和副本上有不同的触发器,那么必须使用基于语句的复制。但是,要启用复制端触发器,不需要专门使用基于语句的复制。只对需要这种效果的语句切换到基于语句的复制,其余时间使用基于行的复制就足够了。
类的更新,调用触发器(或函数)的语句AUTO_INCREMENT
使用基于语句的复制不能正确地复制列。MySQL 8.0将这些语句标记为不安全。(错误# 45677)
触发器可以有用于不同触发事件组合的触发器(插入
,更新
,删除
)和行动时间(之前
,后
),并且允许多个触发器。
为简便起见,”多个触发器”这里是简写”具有相同触发事件和操作时间的多个触发器。”
升级。MySQL 5.7以前的版本不支持多触发器。如果在复制拓扑中升级的服务器使用的版本低于MySQL 5.7,请先升级副本,再升级源。如果升级后的复制源服务器仍然拥有使用不支持多个触发器的MySQL版本的旧副本,那么如果在源上为已经拥有具有相同触发器事件和操作时间的触发器的表创建触发器,则这些副本上将发生错误。
降级。如果您将支持多个触发器的服务器降级为不支持多个触发器的旧版本,则降级会产生以下影响:
对于具有触发器的每个表,所有触发器定义都在
.TRG
表的文件。但是,如果有多个触发器具有相同的触发器事件和操作时间,则当触发器事件发生时,服务器只执行其中一个触发器。有关.TRG
文件,请参阅MySQL Server Doxygen文档的表触发存储部分10bet官方网站https://dev.10bet靠谱mysql.com/doc/index-other.html.如果在降级之后添加或删除了表的触发器,服务器将重写表的触发器
.TRG
文件。重写后的文件在每个触发事件和动作时间的组合中只保留一个触发器;其他的都丢了。
要避免这些问题,请在降级之前修改触发器。对于每个触发器事件和动作时间组合都有多个触发器的表,将每一组触发器转换为单个触发器,如下所示:
对于每个触发器,创建一个存储的例程,其中包含触发器中的所有代码。使用
新
而且老
可以使用参数传递给例程。如果触发器需要来自代码的单个结果值,则可以将代码放在存储函数中,并让函数返回该值。如果触发器需要代码中的多个结果值,则可以将代码放在存储过程中,并使用返回值出
参数。删除表的所有触发器。
为调用刚刚创建的存储例程的表创建一个新触发器。因此,此触发器的效果与它所替代的多个触发器相同。