本节介绍如何在已在线的服务器上禁用 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 的早期版本,可以使用正常的降级程序立即进行。