MySQL复制(五)GTID与Position转换

node-current node-current

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中。

扫码关注公众号,获取最新发布。

posted on 2023-11-16 15:50  一介IT  阅读(295)  评论(0)    收藏  举报

导航