系统:centos7
主库:192.168.225.128:3307
从库1:192.168.225.129:3307
主从复制传统复制已配置完毕

一、前提:

1.要求所有的mysql版本5.7.6或更高的版本。
2.目前拓扑结构中所有的mysql的gtid_mode的值为off状态。
3.如下的操作步骤都是有序的,不要跳跃着进行。

补充一下全局系统变量GTID_MODE变量值说明:

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

需要注意的是,这几个值的改变是有顺序的,即

off<--->OFF_PERMISSIVE<--->ON_PERMISSIVE<--->ON

不能跳跃执行,会报错。

二、传统复制切换为GTID复制

前提:测试步骤中S1默认都是打开log-bin选项的,
操作步骤

1. 在M、S实例上,将ENFORCE_GTID_CONSISTENCY设置为warning,哪台先执行不影响结果

M:mysql> set @@global.enforce_gtid_consistency=warn;
S:mysql> set @@global.enforce_gtid_consistency=warn;

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

2. 在M、S上,设置ENFORCE_GTID_CONSISTENCY为ON,哪台先执行不影响结果

M:mysql> set @@global.enforce_gtid_consistency=on;
S:mysql> set @@global.enforce_gtid_consistency=on;

3. 在M、S实例上,设置GTID_MODE为off_permissiv;哪台先执行不影响结果

M:mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
S:mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

4. 在M、S实例上,设置GTID_MODE为on_permissiv;哪台先执行不影响结果

M: Mysql> SET @@GLOBAL.GTID_MODE = on_permissive;
S: Mysql> SET @@GLOBAL.GTID_MODE = on_permissive;

5. 在M、S上检查变量ONGOING_ANONYMOUS_TRANSACTION_COUNT,需要等到此变量为0

Mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
Mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

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

M:show master status;
S:show slave status\G
或者或者slave直接用函数:
SELECT MASTER_POS_WAIT('mysql-binlog.000005',154);

返回结果大于等于0就说明匿名事务已经全部复制完成

clipboard.png

7. 确认整个拓扑结构中已经没有匿名事务的存在,

如之前产生的所有匿名事务已经全部被执行完毕,甚至二进制日志中也不要有匿名事务,可以通过flush logs,并让mysql来自动清理旧的二进制日志文件。

8. 在每个mysql实例上,设置GTID_MODE为on

M: mysql> SET @@GLOBAL.GTID_MODE = ON;
S: mysql> SET @@GLOBAL.GTID_MODE = ON;

9. 在每个mysql实例的配置文件my.cnf上,

增加

gtid-mode=ON
enforce_gtid_consistency=on

10. 完成

clipboard.png


linda玲
438 声望27 粉丝

每天进步一点点