本节描述如何在线禁用GTID事务的服务器。这一过程不需要将服务器离线,并适合生产环境使用。但是,如果您可以在禁用GTID模式时将服务器离线,那么该过程将更容易。
该过程与在线启用GTID事务类似,但步骤相反。唯一的区别是等待记录事务复制的点。
在开始之前,所有服务器必须满足以下条件:
-
所有服务器都将
gtid_mode
设置为ON
。 -
没有服务器设置
--replicate-same-server-id
选项。如果设置了该选项,并且--log-replica-updates
选项(默认)启用二进制日志记录(也是默认的),那么您无法禁用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
。然后,手动执行备份或等待下一个周期性备份例程。理想情况下,您应该等待服务器清除所有在上一步完成时存在的二进制日志,并等待在那之前执行的备份过期。
请注意,包含GTID事务的日志不能在下一步使用。因此,在继续之前,您必须确保没有未提交的GTID事务存在于拓扑结构中。
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.gtid_mode = OFF;
-
在每个服务器上,将
gtid_mode
设置为OFF
在my.cnf
中。可选地,您也可以将enforce_gtid_consistency
设置为OFF
;在执行后,您也应该将enforce_gtid_consistency
添加到配置文件中。
如果您想降级到早期版本的MySQL,现在可以按照正常的降级过程进行。