mysql在线将传统复制模式改为GTID复制模式

发布时间 2023-04-18 14:20:15作者: whiteY

gtid_mode参数各个值的含义:
OFF:生成的是匿名事务,从库只能应用匿名事务
OFF_PERMISSIVE:生成的是匿名事务,从库可以应用匿名事务和GTID事务
ON_PERMISSIVE:生成的是GTID事务,从库可以应用匿名事务和GTID事务
ON:生成的是GTID事务,从库只能应用GTID事务

一、在线开启GTID,需要满足两个条件

1、复制拓扑结构中,所有的数据库版本必须大于等于5.7.6

2、 gtid_mode必须设置为OFF

二、在线开启GTID

1、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=WARN,设置后,所有事务都允许违反GTID的一致性;

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

开启这个选项时候,让服务器在正常负载下运行一段时间,观察err log,如果有发现任何warning,需要通知应用进行调整,直到不出现warning。

2、在每一台服务器上设置ENFORCE_GTID_CONSISTENCY=ON,确保所有的事务都不能违反GTID的一致性;


SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;

这一步一旦执行,违反GTID的操作都将被拒绝,比如create table as select 操作。

3、在每一台服务器上设置GTID_MODE=OFF_PERMISSIVE,表示新的事务是匿名的,同时允许复制的事务是GTID或是匿名的;


SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

注意:哪个服务器首先执行此语句并不重要,但重要的是所有服务器在任何服务器开始下一个步骤之前完成此步骤。

4、在每一台服务器上设置GTID_MODE=ON_PERMISSIVE,表示新的事务使用GTID,同时允许复制的事务是GTID或是匿名的;

SET @@GLOBAL.GTID_MODE=ON_PERMISSIVE;

注意:需要确保这一步操作在所有的服务器上都执行。

5、等待ONGOING_ANONYMOUS_TRANSACTION_COUNT状态值为0,表示已标记为匿名的正在进行的事务数量,如果状态值为0表示无事务等待被处理;


SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

注意:在所有从库上查询该状态,必须要为0才能进行下一步。
多观察一段时间,确认这个统计值Ongoing_anonymous_transaction_count为0,如果不为0,强行修改可能导致数据丢失,然后确认从库Retrieved_Gtid_Set和Executed_Gtid_Set正常增长

Note
On a replica, it is theoretically possible that this shows zero and then nonzero again. This is not a problem, it suffices that it shows zero once.

6、等待在步骤5之前生成的所有事务复制到所有服务器。您可以在不停止更新的情况下完成此操作:唯一重要的是所有匿名事务都被复制完成。

7、如果你需要用binlog来实现一个闪回操作,需要确保你已经不需要那些不包含GTID的binlog了,否则需要等那些binlog过期,才可以进行下一步操作

8、在每一台服务器上设置GTID_MODE=ON,表示在所有服务器上开启GTID;


SET @@GLOBAL.GTID_MODE=ON;

注意:需要在所有的实例上执行。

9、修改my.cnf的配置;

enforce_gtid_consistency=1
gtid_mode=ON

10、将复制模式从基于binlog位置调整为基于GTID模式.


STOP SLAVE;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
START SLAVE;