Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


19.5.1.36 复制和触发器

使用语句级别复制时,源服务器上的触发器也在副本服务器上执行。使用行级别复制时,源服务器上的触发器不在副本服务器上执行,而是将触发器执行的行变化复制到副本服务器上。

这种行为是有意的。如果在行级别复制中,副本服务器应用了触发器和由它们引起的行变化,那么这些变化将在副本服务器上被应用两次,从而导致源服务器和副本服务器上的数据不同。

如果您想让触发器在源服务器和副本服务器上都执行,可能是因为您在源服务器和副本服务器上有不同的触发器,您需要使用语句级别复制。然而,您不需要将所有语句都转换为语句级别复制。您可以将某些语句转换为语句级别复制,而将其他语句保持为行级别复制。

调用触发器(或函数)以更新一个AUTO_INCREMENT列的语句在语句级别复制中不正确地被复制。MySQL 8.4将这样的语句标记为不安全的(Bug #45677)。

触发器可以具有不同的触发事件(INSERTUPDATEDELETE)和动作时间(BEFOREAFTER),并且允许多个触发器。

为了简洁,以下“多个触发器”是指“多个触发器,其中每个触发器都具有相同的触发事件和动作时间”。

升级。多个触发器不支持在MySQL 5.7之前的版本中。如果您在复制拓扑结构中升级了服务器,并且这些服务器使用的版本早于MySQL 5.7,您需要首先升级副本服务器,然后再升级源服务器。如果升级后的复制源服务器仍然有使用早于MySQL 5.7的版本的副本服务器,那么在源服务器上创建触发器时,会在这些副本服务器上出现错误,因为这些副本服务器不支持多个触发器。

降级。如果您将支持多个触发器的服务器降级到不支持多个触发器的版本,那么降级将产生以下效果:

  • 对于每个表,该表的触发器定义在该表的.TRG文件中。然而,如果有多个触发器具有相同的触发事件和动作时间,服务器将在触发事件发生时执行其中的一个。关于.TRG文件的信息,请参阅MySQL Server Doxygen文档的Table Trigger Storage部分,available at https://dev.mysql.com/doc/index-other.html

  • 如果在降级后添加或删除表的触发器,服务器将重写该表的.TRG文件。重写的文件将保留每个触发事件和动作时间的唯一触发器;其他触发器将被丢弃。

为了避免这些问题,修改您的触发器在降级前。对于每个表,其中有多个触发器组合在一起的触发事件和动作时间,转换每个这样的触发器集为单个触发器,以下是转换步骤:

  1. 对于每个触发器,创建一个存储程序,其中包含触发器中的所有代码。使用NEWOLD访问的值可以通过参数传递给程序。如果触发器需要单个结果值,可以将代码放置在存储函数中,并让函数返回该值。如果触发器需要多个结果值,可以将代码放置在存储程序中,并使用OUT参数返回值。

  2. 删除该表的所有触发器。

  3. 创建一个新的触发器,该触发器调用刚创建的存储程序。该触发器的效果与多个触发器相同。