MySQL主从复制(9)传统复制模式切换GTID复制模式

TangLu MySQL 2021-03-15 1936 0

在MySQL 5.6以前不支持GTID机制,所以都是使用传统的binlog模式进行主从同步。在5.6以后引入的GTID机制可以对数据库的维护工作带来不少便利,大多数用户最终都会选择切换到GTID复制模式。在进行主从复制模式的切换之前需要知悉以下GTID相关设置:

· MySQL 5.7.6之前gtid_mode是只读参数,无法在线配置,需要重启服务


· MySQL事务分为匿名事务(anonymous)和GTID事务。匿名事务不带有GTID信息,在主从复制中必须指定binlog文件和位置点(即传统模式)


· MySQL 5.7.6开始,gtid_mode变量有ON、ON_PERMISSIVE、OFF_PERMISSIVE、OFF四个值

1、gtid_mode=OFF:主库生成匿名事务,从库也只能应用匿名事务,即从库的gtid_mode应该是OFF或OFF_PERMISSIVE

2、gtid_mode=OFF_PERMISSIVE:主库事务为匿名事务,从库接受匿名事务或GTID事务,但不允许仅GTID模式。即从库gtid_mode可以为OFF、OFF_PERMISSIVE或ON_PERMISSIVE

3、gtid_mode=ON_PERMISSIVE:主库事务是GTID事务,从库接受匿名事务或GTID事务。即从库gtid_mode可以为OFF_PERMISSIVE、ON_PERMISSIVE或ON

4、gtid_mode=ON:主库从库都只能应用GTID事务,即主为ON,从为ON_PERMISSIVE或ON


· 在修改gtid_mode变量的值时,必须遵守兼容顺序逐级调整(ON --> ON_PERMISSIVE --> OFF_PERMISSIVE --> OFF或相反顺序)。主库确定某个取值后从库只能取相同的值或该值临近两侧的值。例如主库是ON_PERMISSIVE,那么从库可以是ON、ON_PERMISSIVE、OFF_PERMISSIVE,但不能是OFF;主库是ON,那么从库可以是ON、ON_PERMISSIVE,但不能是OFF_PERMISSIVE、OFF。即在主从都是gtid_mode=OFF的情况下想要修改gtid_mode=ON时需要按照主从都设置gtid_mode=OFF_PERMISSIVE-->主从都设置gtid_mode=ON_PERMISSIVE-->检查SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT’的值,直到输出为0代表匿名事务应用完成,否则后面设置master_auto_position=1会报错Cannot replicate anonymous transaction when AUTO_POSITION = 1-->主从设置gtid_mode=ON的顺序,最后change master to master_auto_position=1”的顺序


· 主从都是gtid_mode=ON的情况下想要关闭GTID模式,需要按照“主从都设置gtid_mode=ON_PERMISSIVE-->主从都设置gtid_mode=OFF_PERMISSIVE-->检查SELECT @@GLOBAL.GTID_OWNED,直到输出值为空-->主从都设置gtid_mode=OFF-->修改主从复制模式为binlog”的顺序


一、传统复制在线变更为GTID复制(每一步操作都会刷新binlog)

1、在每个节点开启GTID的一致性告警,然后观察1-2分钟看每个节点的错误日志是否有warning信息,如果有则需要根据日志进行调整

mysql > set global enforce_gtid_consistency = WARN; 


2、如果每个节点都没有出现warn信息,则在每个节点开启GTID一致性配置,此时违反GTID的操作都无法再执行,如create table as select

mysql > set global enforce_gtid_consistency = ON;


3、在每个节点配置gtid_mode=OFF_PERMISSIVE

mysql > set global gtid_mode = OFF_PERMISSIVE;
mysql > show global variables like 'gtid_executed'  #正常情况该值为空


4、在每个节点配置gtid_mode=ON_PERMISSIVE

mysql > set global gtid_mode = ON_PERMISSIVE;
mysql > show global variables like 'gtid_executed'  #正常情况该值开始出现GTID信息


5、等待匿名事务全部应用完成,确保主从节点ONGOING_ANONYMOUS_TRANSACTION_COUNT统计值为0,否则强行更改会导致数据丢失。

SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT'   #确保值为0
show slave status #确保Executed_Gtid_Set正常增长


6、所有节点刷新binlog并清理历史binlog

flush logs; #新日志将包含gtid信息
show master status; #假设为mysql-bin.000007
purge binary logs to mysql-bin.000007 #从库操作前需要确认Relay_Master_Log_File的值和主库大于或等于mysql-bin.000007


7、在每个节点开启gtid_mode

mysql > set global gtid_mode = ON;


8、在从库重启复制进程并进行验证

mysql > stop slave;
mysql > change master to master_auto_position=1
mysql > start slave;
mysql > show slave status


9、将gtid配置写入配置文件


、传统复制离线变更为GTID复制

1、等待从库追赶上主库的数据(比较Read_Master_Log_Pos和Exce_Master_Log_Pos的值,如果相等代表主从完全同步)


2、将gtid配置写入配置文件


3、在所有节点刷新日志并进行清理,在清理历史日志前建议先进行备份

flush binary logs;
show master status; #获取最新文件名,假设为000007
purge binary logs to 'mysql-bin.000007';



4、先重启主库,再重启从库


5、登录从库配置自动定位

change master to master_auto_position = 1;
start slave;



三、GTID模式离线变更为传统复制(通常不会这么做)

1、等待从库追赶上主库的数据(比较Read_Master_Log_Pos和Exce_Master_Log_Pos的值,如果相等代表主从完全同步)


2、将gtid_mode=OFF的配置写入配置文件


3、在所有节点刷新日志并进行清理,在清理历史日志前建议先进行备份

flush binary logs;
show master status; #获取最新文件名,假设为000007
purge binary logs to 'mysql-bin.000007';


4、先重启主库,再重启从库


5、登录从库关闭自动定位

stop slave;
change master to relay_log_file='mysql-relay-bin.000003',relay_log_pos=375351,master_auto_position = 0; #master_pos信息可不指定,但必须指定relay信息,否则从库复制延迟后会清理掉未应用的中继日志,可能导致复制异常
start slave;


评论