16.1.4.3 停用在线 GTIDTransaction

本节介绍如何在已联机的服务器上禁用 GTID 事务。此过程不需要使服务器脱机,并且适合在 Producing 使用。但是,如果在禁用 GTIDs 模式时可以使服务器脱机,则此过程会更容易。

该过程类似于在服务器联机时启用 GTID 事务,但是步骤相反。唯一不同的是您 await 记录的事务复制的时间点。

在开始之前,请确保服务器满足以下前提条件:

  • 拓扑中的所有服务器必须使用 MySQL 5.7.6 或更高版本。您不能在任何单个服务器上在线禁用 GTID 事务,除非拓扑中的* all *服务器正在使用此版本。

  • 所有服务器都将gtid_mode设置为ON

  • 在每个副本上执行以下操作,如果您使用多源复制,请对每个通道执行此操作,并包含FOR CHANNEL channel 子句:

STOP SLAVE [FOR CHANNEL 'channel'];
CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, \
MASTER_LOG_POS = position [FOR CHANNEL 'channel'];
START SLAVE [FOR CHANNEL 'channel'];
  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
  • 在每个服务器上,await 直到变量@@ GLOBAL.GTID_OWNED 等于空字符串。可以使用以下方法进行检查:
SELECT @@GLOBAL.GTID_OWNED;

在副本上,从理论上讲,它有可能为空然后又为非空。这不是问题,只需将其清空一次即可。

  • await 任何二进制日志中当前存在的所有事务复制到所有副本。有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参阅第 16.1.4.4 节,“验证匿名事务的复制”

  • 如果您将二进制日志用于复制以外的其他用途,例如进行时间点备份或还原:请等到不需要具有 GTID 事务的旧二进制日志。

例如,在完成步骤 5 之后,您可以在进行备份的服务器上执行FLUSH LOGS。然后,要么明确地进行备份,要么 await 您可能设置的任何定期备份例程的下一个迭代。

理想情况下,await 服务器清除第 5 步完成时存在的所有二进制日志。此外,请 await 第 5 步到期之前进行的所有备份。

Important

这是此过程中的重要一点。重要的是要理解包含 GTID 事务的日志不能在下一步之后使用。在 continue 之前,必须确保 GTID 事务在拓扑中的任何地方都不存在。

  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = OFF;

如果您要设置enforce_gtid_consistency=OFF,则可以立即进行设置。设置之后,您应该将enforce_gtid_consistency=OFF添加到您的配置文件中。

如果要降级到 MySQL 的较早版本,可以立即使用正常的降级过程进行降级。