【MySQL】MySQL5.7传统复制切换为GTID复制

 

【MySQL】MySQL5.7传统复制切换为GTID复制


 

前言:最近还是在做MariaDB10.1.12升级为MySQL5.7的升级方案,其中有一个环节涉及到传统复制到GTID复制的在线切换,本文就介绍下如何是现在线切换。

一、参数解析

下面对GTID_MODE变量如下解释:

解释
OFF 新事务是非GTID, Slave只接受不带GTID的事务,传送来GTID的事务会报错
OFF_PERMISSIVE 新事务是非GTID, Slave即接受不带GTID的事务也接受带GTID的事务
ON_PERMISSIVE 新事务是GTID, Slave即接受不带GTID的事务也接受带GTID的事务
ON 新事务是GTID, Slave只接受带GTID的事务

我们在更改GTID_MODE时不可直接跳跃更改,否则会提示报错

root@localhost [xucl]>set global gtid_mode=ON;
ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.

二、在线更改

1.将enforce_gtid_consistency设置为WARNING,主库从库都要设置,无先后顺序。

set @@global.enforce_gtid_consistency=warn;

注意:执行完这条语句后,如果出现GTID不兼容的语句用法,在错误日志会记录相关信息,那么需要调整应该程序避免不兼容的写法,直到完全没有产生不兼容的语句,可以通过应用程序去排查所有的sql,也可以设置后观察错误日志一段时间,建议观察过,这一步非常重要。

2.将ENFORCE_GTID_CONSISTENCY设置为ON,主库从库都要设置,无先后顺序。

set @@global.enforce_gtid_consistency=on;

3.设置GTID_MODE为off_permissiv,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

4.设置GTID_MODE为on_permissiv,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = on_permissive;

5.主从检查变量ONGOING_ANONYMOUS_TRANSACTION_COUNT

SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

需要等到该变量为0

6.确保所有的匿名事务(非GTID事务)已经被完全复制到所有的server上。
主库

show master status;

从库

show slave statusG

确保事务在从库都会放完毕
或者:

SELECT MASTER_POS_WAIT('mysql-bin.00000x', xxx);

7.确认整个拓扑结构中已经没有匿名事务的存在,如之前产生的所有匿名事务已经全部被执行完毕,甚至二进制日志中也不要有匿名事务,可以通过flush logs,并让mysql来自动清理旧的二进制日志文件。

8.设置GLOBAL.GTID_MODE为ON,主库从库都要设置,无先后顺序。

SET @@GLOBAL.GTID_MODE = ON;

9.my.cnf增加GTID_MODE = ON;

至此,GTID复制在线切换完成。

原文地址:https://www.cnblogs.com/yangyongchao/p/12335221.html