本节介绍如何在已经联机并且使用匿名事务的服务器上启用GTID事务。此过程不需要让服务器停止服务,并适合在生产中使用。当然,如果在启用GTID事务时可以使服务器停止服务,则处理过程会更容易。
在开始之前,请确保服务器满足以下前提条件:
-
拓扑中的服务器都必须使用MySQL 5.7.6或更高版本。除非拓扑中的服务器都使用符合条件的同样版本,否则不能确保可以在线启用GTID事务。
-
所有服务器均[
gtid_mode
]为默认值OFF
。
可以随时暂停以下过程,之后将其恢复原样,该过程具有容错性。
注意
在继续下一步之前,确保完成上一步的操作至关重要。
要启用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
为零。可以使用以下命令进行检查:
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
注意:
在从库上,它有可能显示为零,然后再次显示为非零。这不是问题,只要显示一次为零即可。等待匿名事务都被从库执行完毕。
在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE = ON;
在每个服务器上,将 gtid_mode=ON
和 enforce_gtid_consistency=ON
添加到my.cnf
。
现在,所有事务都已具有GTID。要开始使用GTID协议以便以后可以执行自动故障转移,请在每个从库上执行以下命令。(可选)如果使用多源复制,请对每个通道执行此操作,并包含以下子句:FOR CHANNEL
channel
STOP SLAVE [FOR CHANNEL 'channel'];
CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
START SLAVE [FOR CHANNEL 'channel'];