在线启用GTID交易
本节介绍如何在已经联机并且使用匿名事务的服务器上启用GTID事务以及有选择地自动定位。此过程不需要使服务器脱机,并且适合在生产中使用。但是,如果在启用GTID事务时可以使服务器脱机,则处理过程会更容易。
在开始之前,请确保服务器满足以下前提条件:
- 拓扑中的所有服务器都必须使用MySQL 5.7.6或更高版本。除非拓扑中的所有服务器都使用此版本,否则您不能在任何单个服务器上在线启用GTID事务。
- 所有服务器均
gtid_mode
设置为默认值OFF
。
可以随时暂停以下过程,之后将其恢复原处,或者通过跳转到“在线禁用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
为零。可以使用以下方法进行检查:SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';注意
在复制从属服务器上,从理论上讲,这有可能显示为零,然后再次显示为非零。这不是问题,只要显示一次为零即可。
等待直到步骤5生成的所有事务复制到所有服务器。您可以在不停止更新的情况下执行此操作:唯一重要的是复制所有匿名事务。
有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参见“验证匿名事务的复制”。
如果您将二进制日志用于复制以外的其他用途(例如,时间点备份和还原),请等到不需要具有不带GTID的事务的旧二进制日志。
例如,在完成步骤6之后,您可以
FLUSH LOGS
在要进行备份的服务器上执行。然后,要么明确地进行备份,要么等待您可能已设置的任何定期备份例程的下一个迭代。理想情况下,等待服务器清除第6步完成时存在的所有二进制日志。另外,请等待第6步到期之前进行的所有备份。
重要
这是第二个重点。至关重要的是要了解,下一步之后就不能使用没有GTID的包含匿名事务的二进制日志。完成此步骤后,必须确保没有GTID的事务在拓扑中的任何地方都不存在。
在每台服务器上,执行:
SET @@GLOBAL.GTID_MODE =ON ;在每个服务器上,将
gtid_mode=ON
和添加enforce_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'];