前言:最近还是在做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 status\G
确保事务在从库都会放完毕
或者:
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复制在线切换完成。