19.1.4.2 在线启用 GTID 事务
本节描述了如何在线启用 GTID 事务,并可选地启用自动定位,用于已经在线运行的服务器,这些服务器当前使用匿名事务。这个过程不需要停机服务器,并且适用于生产环境。但是,如果您可以在启用 GTID 事务时将服务器停机,这个过程将更简单。
您可以设置复制通道,以将 GTIDs 分配给未经分配的复制事务。这项功能使得可以从不使用 GTID 基础复制的源服务器到使用 GTID 的副本服务器。如果可能,请在源服务器上启用 GTIDs,如本过程所述,使用这个方法代替。分配 GTIDs 是为无法在源服务器上启用 GTIDs 的情况设计的。有关这个选项的更多信息,请见第19.1.3.6节,“从不使用 GTID 的源服务器到使用 GTID 的副本服务器”。
在开始之前,请确保gtid_mode
在所有服务器上设置为OFF
。
以下过程可以在任何时候暂停,并在后续恢复到相应的步骤第19.1.4.3节,“在线禁用 GTID 事务”,以便在出现任何未相关问题时处理该问题,然后继续执行该过程。
要启用 GTID 事务,您必须完成以下每个步骤,然后继续执行下一个步骤。
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.enforce_gtid_consistency = WARN;
让服务器运行一段时间,以便在正常工作负载下运行,并监控日志。如果这个步骤在日志中生成任何警告,请调整应用程序,以便只使用 GTID 兼容的功能,并且不生成任何警告。
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.enforce_gtid_consistency = ON;
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.gtid_mode = OFF_PERMISSIVE;
服务器的执行顺序无关紧要,但所有服务器都必须执行该语句,然后才能继续执行下一个步骤。
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.gtid_mode = ON_PERMISSIVE;
与前一个步骤相同,服务器的执行顺序无关紧要,只要每个服务器都执行该语句,然后才能继续执行下一个步骤。
-
在每个服务器上,等待
Ongoing_anonymous_transaction_count
为0
。您可以使用SHOW STATUS
语句来检查该值,如下所示:mysql> SHOW STATUS LIKE 'Ongoing%'; +-------------------------------------+-------+ | Variable_name | Value | +-------------------------------------+-------+ | Ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ 1 row in set (0.00 sec)
在副本服务器上,理论上可能出现
0
然后是非零值。这不是问题,只要在某个时候是0
。 -
等待所有生成到前一个步骤的交易复制到所有服务器上。您可以在不停止更新的情况下执行该步骤;关键是所有匿名事务都被复制到所有服务器上,然后才能继续执行下一个步骤。
查看第19.1.4.4节,“验证匿名事务的复制”以了解如何检查所有匿名事务是否已经复制到所有服务器上。
-
如果您使用二进制日志来实现其他功能,例如点时刻备份和恢复,等待您不再需要包含无GTID事务的旧二进制日志。
例如,在所有事务都已经复制完成后,您可以在备份服务器上执行
FLUSH LOGS
。然后,您可以显式地备份或等待下一个备份计划的下一个迭代。理想情况下,您应该等待服务器清除所有在上一步完成时存在的二进制日志,并等待在此之前采取的备份过期。
请注意,包含匿名事务的二进制日志(即无GTID事务)在下一步后不能使用。在下一步后,您必须确保在任何服务器上没有未提交的无GTID事务。
-
在每个服务器上,执行以下语句:
SET @@GLOBAL.GTID_MODE = ON;
-
在每个服务器上,在
my.cnf
文件中添加gtid-mode=ON
和enforce-gtid-consistency=ON
。这确保了GTID将用于所有已经处理的交易。要使用GTID协议,以便在将来执行自动故障转移,请在每个副本上执行以下语句。如果您使用多源复制,执行以下语句对每个通道,包括FOR CHANNEL
子句:channel
STOP REPLICA [FOR CHANNEL 'channel']; CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 [FOR CHANNEL 'channel']; START REPLICA [FOR CHANNEL 'channel'];