MySQL复制(五)GTID与Position转换
1. 传统Position转换成GTID复制
如果已经在未开启 GITD 的情况下配置了主从复制,可以联机将复制模式修改为 GTID 以及自动定位。由于整个过程不需要停止 MySQL 实例,这种方式适合在生产环境中使用。开始前确保 MySQL 服务器满足以下前提条件:
- 复制拓扑中的所有服务器都必须使用 MySQL 5.7.6 或更高版本。除非拓扑中的所有服务器都使用此版本,否则无法在任何单个服务器上联机启用 GTID 事务。
- 所有服务器的 gtid_mode 默认设置为 OFF。
1.1 环境准备
参考【MySQL复制(一)异步复制之Position】,先搭建position复制方式的主从环境,本节实验环境部署的是 mysql 5.7.40 一主一从环境。
1.2 设置enforce_gtid_consistency为warn
# 在MySQL每个实例上, 将enforce_gtid_consistency设置为warn
# 主
[root@MySQL57 ~]# mysql -uroot -proot
mysql> set @@global.enforce_gtid_consistency=warn;
# 从
[root@Mysql57-Slave ~]# mysql -uroot -proot
mysql> set @@global.enforce_gtid_consistency=warn;
执行完这条语句后,如果出现 GTID 不兼容的语句用法,会在 error log 记录相关信息,那么需要调整该程序避免不兼容的写法,直到完全没有不兼容的语句。
1.3 设置enforce_gtid_consistency为on
#把MySQL每个实例的ENFORCE_GTID_CONSISTENCY值设置为on。
# 主&从
mysql> set @@global.enforce_gtid_consistency=on;
1.4 设置GTID模式为off_permissive
# 将所有MySQL实例的GTID模式设置为off_permissive
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
1.5 设置GTID模式为on_permissive
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
1.6 检查从库等待状态值
# 如果等待状态变量为0,一味着没有等待的事务,可以进行下一步操作
mysql> SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
+-------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0 |
+-------------------------------------+-------+
1 row in set (0.00 sec)
1.7 保所有匿名事务复制
# 确保所有的匿名事务已经被完全复制到所有的slave上
# 从库
mysql> show slave status\G
*************************** 1. row ***************************
......
Relay_Log_File: Mysql57-Slave-relay-bin.000015
......
Exec_Master_Log_Pos: 154
......
mysql> SELECT MASTER_POS_WAIT('mysql-bin.000008', 154);
+------------------------------------------+
| MASTER_POS_WAIT('mysql-bin.000008', 154) |
+------------------------------------------+
| 0 |
+------------------------------------------+
1 row in set (0.00 sec)
# 返回结果大于或等于0就说明匿名事务已经全部复制完成
1.8 设置GTID_MODE为on
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = ON;
1.9 change master
# 从
mysql>
stop slave;
change master to master_auto_position = 1;
start slave;
# 查看状态
show slave status\G
# 查看Auto_Position:
Auto_Position: 0 -- pos复制
Auto_Position: 1 -- gtid复制
# 数据测试(略)
1.10 参数持久化
可以将以上参数的最终值设置到/etc/my.cnf中。
2. GTID转换成传统Position复制
2.1 环境准备
继上一步,或参照【第06章_MySQL复制(四)异步复制之GTID】搭建GTID复制环境。
2.2 停止从库slave
# 每个从库上执行
mysql> stop slave;
2.3 记录从库状态
# 记录Relay_Master_Log_File和Exec_Master_Log_Pos信息
mysql> show slave status\G
*************************** 1. row ***************************
......
Relay_Master_Log_File: mysql-bin.000009
......
Exec_Master_Log_Pos: 652
......
2.4 从库change master
mysql>
change master to master_auto_position = 0, master_log_file = 'mysql-bin.000009', master_log_pos = 652;
2.5 启动主从复制
# 从
mysql>
start slave;
2.6 设置GTID模式为on_permissive
# 将所有MySQL实例的GTID模式设置为ON_permissive
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
2.7 设置GTID模式为off_permissive
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
2.8 等待变量
# 在每台服务器上,等待变量@@GLOBAL.GTID_OWNED等于空字符串。可以使用以下方法检查
# 主&从
mysql> select @@global.gtid_owned;
# 此时复制正常进行,但slave status中的Retrieved_Gtid_Set和Executed_Gtid_Set值不再变化。
2.9 设置GTID_MODE为off
# 主&从
mysql> SET @@GLOBAL.GTID_MODE = off;
2.10 设置enforce_gtid_consistency为off
#把MySQL每个实例的ENFORCE_GTID_CONSISTENCY值设置为on。
# 主&从
mysql> set @@global.enforce_gtid_consistency=0;
# 查看状态
show slave status\G
# 查看Auto_Position:
Auto_Position: 0 -- pos复制
Auto_Position: 1 -- gtid复制
# 数据测试(略)
2.11 参数持久化
可以将以上参数的最终值设置到/etc/my.cnf中。
扫码关注公众号,获取最新发布。

浙公网安备 33010602011771号