系统: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就说明匿名事务已经全部复制完成
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。