本节介绍如何在已联机的服务器上禁用 GTID 事务。此过程不需要使服务器脱机,适合在生产中使用。但是,如果您有可能在禁用 GTIDs 模式时使服务器脱机,则该过程会更容易。
该过程类似于在服务器在线时启用 GTID 事务,但相反的步骤。唯一不同的是您等待记录的事务复制的时间点。
在开始之前,请确保服务器满足以下先决条件:
拓扑中的所有服务器都必须使用 MySQL 5.7.6 或更高版本。您不能在任何单个服务器上在线禁用 GTID 事务,除非拓扑中的所有 服务器都使用此版本。
所有服务器都
gtid_mode
设置为ON
.该
--replicate-same-server-id
选项未在任何服务器上设置。--log-slave-updates
如果此选项与选项(默认设置)一起设置并且启用二进制日志记录(也是默认设置),则无法禁用 GTID 事务 。如果没有 GTID,这种选项组合会导致循环复制中的无限循环。
在每个副本上执行以下操作,如果您使用多源复制,请对每个通道执行此操作并包含
FOR 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']; Or from MySQL 8.0.22 / 8.0.23: 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;
在每台服务器上,等待变量@@GLOBAL.GTID_OWNED 等于空字符串。这可以使用以下方法检查:
SELECT @@GLOBAL.GTID_OWNED;
在副本上,理论上可能这是空的,然后又是非空的。这不是问题,空一次就够了。
等待当前存在于任何二进制日志中的所有事务复制到所有副本。 有关检查所有匿名事务是否已复制到所有服务器的一种方法, 请参见 第 17.1.4.4 节,“验证匿名事务的复制”。
如果您将二进制日志用于除复制之外的任何其他用途,例如进行时间点备份或恢复:请等到您不需要具有 GTID 事务的旧二进制日志。
例如,在第 5 步完成后,您可以
FLUSH LOGS
在要进行备份的服务器上执行。然后明确地进行备份或等待您可能已设置的任何定期备份例程的下一次迭代。理想情况下,等待服务器清除在步骤 5 完成时存在的所有二进制日志。还要等待在第 5 步之前进行的任何备份过期。
重要的这是此过程中的一个重要点。重要的是要了解包含 GTID 事务的日志在下一步之后不能使用。在继续之前,您必须确保拓扑中的任何地方都不存在 GTID 事务。
在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = OFF;
在每个服务器上,设置
gtid_mode=OFF
在my.cnf
.如果你想设置
enforce_gtid_consistency=OFF
,你现在就可以这样做。设置好之后,你应该添加enforce_gtid_consistency=OFF
到你的配置文件中。
如果你想降级到一个早期版本的 MySQL,你现在可以这样做,使用正常的降级过程。