本节介绍如何在已在线的服务器上禁用 GTID 事务。此过程不需要将服务器脱机,适用于生产环境。但是,如果您有可能会在禁用 GTID 模式时将服务器脱机,那么该过程会更容易。
该过程类似于在服务器在线时启用 GTID 事务,但步骤相反。唯一不同的是您等待记录的事务复制的点。
在开始之前,所有服务器必须满足以下条件
所有服务器都将
gtid_mode
设置为ON
。在任何服务器上都没有设置
--replicate-same-server-id
选项。如果您同时设置了此选项和--log-replica-updates
选项(默认)并且启用了二进制日志记录(也是默认设置),则无法禁用 GTID 事务。在没有 GTID 的情况下,这种选项组合会导致循环复制中的无限循环。
在每个副本上执行以下操作;如果您使用的是多源复制,请对每个通道执行此操作,并包含
FOR CHANNEL '
子句channel
'STOP REPLICA [FOR CHANNEL 'channel']; CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 0, SOURCE_LOG_FILE = file, SOURCE_LOG_POS = position [FOR CHANNEL 'channel']; START REPLICA [FOR CHANNEL 'channel'];
在每个服务器上,执行以下语句
SET @@GLOBAL.gtid_mode = ON_PERMISSIVE;
在每个服务器上,执行此处显示的语句
SET @@GLOBAL.gtid_mode = OFF_PERMISSIVE;
在每个服务器上,等待
gtid_owned
等于空字符串;您可以通过以下方式检查这一点SELECT @@GLOBAL.gtid_owned;
在副本上,这可能是空的,然后随后又变为非空。只要这至少为空一次,就没有问题。
等待所有当前存在于任何二进制日志中的事务在所有副本上提交。有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参阅 第 19.1.4.4 节,“验证匿名事务的复制”。
如果您将二进制日志用于复制以外的任何其他目的(例如,执行时间点备份或还原),请等待您不再需要包含 GTID 事务的旧二进制日志。
例如,在完成上一步之后,您可以在要进行备份的服务器上执行
FLUSH LOGS
。然后,您可以手动进行备份,也可以等待您可能设置的任何定期备份例程的下次迭代。理想情况下,您应该等待服务器清除完成上一步 5 时存在的全部二进制日志,以及在此之前进行的任何备份都已过期。
您应该记住,包含 GTID 事务的日志在下一步之后将无法使用。因此,在继续执行之前,您必须确保拓扑结构中的任何地方都不存在未提交的 GTID 事务。
在每个服务器上,执行以下语句
SET @@GLOBAL.gtid_mode = OFF;
在每个服务器上,在
my.cnf
中设置gtid_mode=OFF
。或者,您也可以设置enforce_gtid_consistency=OFF
;之后,您还应该将enforce_gtid_consistency=OFF
添加到您的配置文件中。
如果您想降级到早期版本的 MySQL,您可以现在使用正常的降级流程进行操作。