本节介绍如何在已在线并使用匿名事务的服务器上启用 GTID 事务,以及可选的自动定位。此过程不需要将服务器脱机,适合在生产环境中使用。但是,如果可能在启用 GTID 事务时将服务器脱机,该过程将更简单。
您可以设置复制通道,将 GTID 分配给尚未分配任何 GTID 的复制事务。此功能允许从不使用基于 GTID 的复制的源服务器复制到使用 GTID 的副本。如果可以根据此过程启用复制源服务器上的 GTID,请使用此方法。分配 GTID 是为无法启用 GTID 的复制源服务器设计的。有关此选项的更多信息,请参见第 19.1.3.6 节“从没有 GTID 的源复制到有 GTID 的副本”.
在开始之前,请确保gtid_mode
在所有服务器上都为OFF
。
以下过程可以在任何时候暂停,并在稍后从暂停的位置恢复,也可以通过跳到第 19.1.4.3 节“在线禁用 GTID 事务”(在线禁用 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;
在每台服务器上,将
gtid-mode=ON
和enforce-gtid-consistency=ON
添加到my.cnf
文件中。这将保证所有尚未处理的事务都使用 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'];