16.1.4.2 启用在线 GTIDTransaction

本节介绍如何在已经联机并且使用匿名事务的服务器上启用 GTID 事务,以及有选择地自动定位。此过程不需要使服务器脱机,并且适合在 Producing 使用。但是,如果在启用 GTID 事务时可以使服务器脱机,则处理过程会更容易。

在开始之前,请确保服务器满足以下前提条件:

  • 拓扑中的所有服务器必须使用 MySQL 5.7.6 或更高版本。您不能在任何单个服务器上在线启用 GTID 事务,除非拓扑中的所有服务器都使用此版本。

  • 所有服务器都将gtid_mode设置为默认值OFF

可以随时暂停以下过程,然后将其恢复到原来的位置,或者通过跳转到相应的步骤第 16.1.4.3 节,“在线禁用 GTID 事务”(禁用 GTID 的在线过程)进行反向操作。这使该过程具有容错性,因为可以照常处理过程中间可能出现的任何不相关的问题,然后 continue 该过程。

Note

在 continue 下一步之前,完成每一步至关重要。

启用 GTIDTransaction:

  • 在每台服务器上,执行:
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

让服务器在正常工作量下运行一段时间并监视日志。如果此步骤在日志中引起任何警告,请调整您的应用程序,使其仅使用与 GTID 兼容的功能,并且不生成任何警告。

Important

这是重要的第一步。在 continue 下一步之前,必须确保错误日志中未生成任何警告。

  • 在每台服务器上,执行:
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

哪个服务器首先执行此语句并不重要,但是重要的是所有服务器都必须先完成此步骤,然后任何服务器才开始执行下一步。

  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

哪个服务器先执行此语句并不重要。

  • 在每台服务器上,await 状态变量ONGOING_ANONYMOUS_TRANSACTION_COUNT为零。可以使用以下方法进行检查:
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

Note

在副本上,从理论上讲,这有可能显示为零,然后再次显示为非零。这不是问题,只要显示一次为零即可。

  • await 直到步骤 5 生成的所有事务复制到所有服务器。您可以在不停止更新的情况下执行此操作:唯一重要的是所有匿名事务都将被复制。

有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参阅第 16.1.4.4 节,“验证匿名事务的复制”

  • 如果您将二进制日志用于复制以外的其他用途(例如,时间点备份和还原),请等到不需要具有不带 GTID 的事务的旧二进制日志。

例如,完成第 6 步后,您可以在要进行备份的服务器上执行FLUSH LOGS。然后,要么明确地进行备份,要么 await 您可能设置的任何定期备份例程的下一个迭代。

理想情况下,await 服务器清除第 6 步完成时存在的所有二进制日志。另外,请 await 第 6 步到期之前进行的所有备份。

Important

这是第二个重点。重要的是要理解,下一步之后不能使用没有 GTID 的包含匿名事务的二进制日志。执行此步骤后,必须确保没有 GTID 的事务在拓扑中的任何地方都不存在。

  • 在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = ON;
  • 在每个服务器上,将gtid_mode=ONenforce_gtid_consistency=ON添加到my.cnf

现在,您可以确保所有事务都具有 GTID(步骤 5 或更早版本中生成的事务已被处理)。要开始使用 GTID 协议以便以后可以执行自动故障转移,请在每个副本上执行以下操作。 (可选)如果使用多源复制,请对每个通道执行此操作,并包含FOR CHANNEL channel子句:

STOP SLAVE [FOR CHANNEL 'channel'];
CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
START SLAVE [FOR CHANNEL 'channel'];