19.1.4.3 在线禁用 GTID 事务
本节描述了在线禁用 GTID 事务的过程。这一过程不需要将服务器停机,并且适用于生产环境。但是,如果您可以在禁用 GTIDs 模式时将服务器停机,这个过程将更简单。
禁用 GTID 事务的过程与在线启用 GTID 事务的过程类似,但反向执行步骤。唯一的区别是,在等待已日志的事务复制的点。
在开始之前,所有服务器都必须满足以下条件:
-
所有服务器的
gtid_mode
设置为ON
。 -
服务器上没有设置
--replicate-same-server-id
选项。您不能禁用 GTID 事务,如果同时设置了--log-replica-updates
选项(默认)和启用二进制日志记录(也默认)。在没有 GTIDs 的情况下,这种组合将在环回复lication中引发无限循环。
-
在每个副本上执行以下命令;如果使用多源复制,需要在每个通道上执行,并包括
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节,“Verifying Replication of Anonymous Transactions”了解检查所有匿名事务是否已复制到所有服务器的方法。
-
如果您使用二进制日志记录来执行其他操作,例如点时备份或恢复—等待您不再需要包含 GTID 事务的旧二进制日志。
例如,在上一步骤完成后,您可以在服务器上执行
FLUSH LOGS
。然后,您可以手动备份或等待下一个备份计划的下一个迭代。理想情况下,您应该等待服务器 purge 所有在上一步骤完成时存在的二进制日志,并等待在备份之前存在的所有备份过期。
您应该记住,包含 GTID 事务的日志不能在下一步骤后使用。因此,在继续之前,您必须确保在拓扑结构中不存在未提交的 GTID 事务。
-
在每个服务器上执行以下语句:
SET @@GLOBAL.gtid_mode = OFF;
-
在每个服务器上,在
my.cnf
文件中设置gtid_mode=OFF
。可选地,您还可以设置enforce_gtid_consistency=OFF
;完成后,您也需要将enforce_gtid_consistency=OFF
添加到配置文件中。
如果您想降级到 MySQL 的较早版本,可以现在使用正常的降级过程。