在MySQL 5.6以前不支持GTID机制,所以都是使用传统的binlog模式进行主从同步。在5.6以后引入的GTID机制可以对数据库的维护工作带来不少便利,大多数用户最终都会选择切换到GTID复制模式。在进行主从复制模式的切换之前复习下GTID的相关设置:

· MySQL 5.7.6之前gtid_mode是只读参数,无法在线配置,需要重启服务

· MySQL事务分为匿名事务(anonymous)和GTID事务。匿名事务不带有GTID信息,在主从复制中必须指定binlog文件和位置点
· MySQL 5.7.6开始gtid_mode有四个值

  • · gtid_mode=OFF:主库新启事务以及从库所有事务都必须是匿名事务。比如主库发起一个匿名事务后,这个没有GTID的事务binlog同步到从库进行复制时,从库开启的这个事务也必须是匿名的,即从库的gtid_mode应该是OFF或OFF_PERMISSIVE
  • · gtid_mode=OFF_PERMISSIVE:主库新启事务是匿名事务,从库事务允许匿名事务或GTID事务,但不允许仅GTID模式。即从库gtid_mode需要是ON_PERMISSIVE或OFF_PERMISSIVE或OFF
  • · gtid_mode=ON_PERMISSIVE:主库新启事务是GTID事务,从库事务允许匿名事务或GTID事务。即从库gtid_mode需要是ON或ON_PERMISSIVE或OFF_PERMISSIVE
  • · gtid_mode=ON:主库新启事务是GTID事务,从库的事务也要求是GTID事务,即主为ON,从为ON_PERMISSIVE或ON

· 各值兼容规律按照ON–ON_PERMISSIVE–OFF_PERMISSIVE–OFF顺序。主库确定某个取值后从库只能取相同的值或该值临近两侧的值。例如主库是ON_PERMISSIVE,那么从库可以是ON、ON_PERMISSIVE、OFF_PERMISSIVE,但不能是OFF;主库是ON,那么从库可以是ON、ON_PERMISSIVE,但不能是OFF_PERMISSIVE、OFF。
· 在修改gtid_mode值时只能逐级修改,例如想从ON修改为OFF,那么要先修改为ON_PERMISSIVE,然后修改为OFF_PERMISSIVE,最后修改为OFF(从OFF修改为ON同理)。即在主从都是gtid_mode=OFF的情况下想要修改gtid_mode=ON时需要按照主从都设置gtid_mode=OFF_PERMISSIVE–>主从都设置gtid_mode=ON_PERMISSIVE–>检查SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT’的值,直到输出为0代表匿名事务应用完成,否则后面设置master_auto_position=1会报错Cannot replicate anonymous transaction when AUTO_POSITION = 1–>主从设置gtid_mode=ON的顺序,最后change master to master_auto_position=1”的顺序
· 主从都是gtid_mode=ON的情况下想要关闭GTID模式,需要按照“主从都设置gtid_mode=ON_PERMISSIVE–>主从都设置gtid_mode=OFF_PERMISSIVE–>检查SELECT @@GLOBAL.GTID_OWNED,直到输出值为空–>主从都设置gtid_mode=OFF–>修改主从复制模式为binlog”的顺序

一、传统复制在线变更为GTID复制

1、在每个节点开启GTID的一致性告警,然后观察1-2分钟看每个节点的错误日志是否有warning信息,如果有则需要根据日志进行调整

mysql > set global enforce_gtid_consistency = WARN; #开启后观察mysql 错误日志

2、如果每个节点都没有出现warn信息,则在每个节点开启GTID一致性配置 

mysql > set global enforce_gtid_consistency = ON;

3、在每个节点配置gtid_mode=OFF_PERMISSIVE 

mysql > set global gtid_mode = OFF_PERMISSIVE;
mysql > show global variables like 'gtid_executed'  #正常情况该值为空

4、在每个节点配置gtid_mode=ON_PERMISSIVE 

mysql > set global gtid_mode = ON_PERMISSIVE;
mysql > show global variables like 'gtid_executed'  #正常情况该值开始出现GTID信息

5、等待匿名事务全部应用完成 

SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT'  #该值出现0代表完成

6、所有节点刷新binlog并清理历史binlog 

flush logs; #新日志将包含gtid信息
show master status; #假设为mysql-bin.000007
purge binary logs to mysql-bin.000007 #从库操作前需要确认Relay_Master_Log_File的值和主库大于或等于mysql-bin.000007

7、在每个节点开启gtid_mode 

mysql > set global gtid_mode = ON;

8、在从库重启复制进程并进行验证 

mysql > stop slave;
mysql > change master to master_auto_position=1
mysql > start slave;
mysql > show slave status

9、将gtid配置写入配置文件 

、传统复制离线变更为GTID复制

1、等待从库追赶上主库的数据(比较Read_Master_Log_Pos和Exce_Master_Log_Pos的值,如果相等代表主从完全同步)

2、将gtid配置写入配置文件

3、在所有节点刷新日志并进行清理,在清理历史日志前建议先进行备份

flush binary logs;
show master status; #获取最新文件名,假设为000007
purge binary logs to 'mysql-bin.000007';

4、先重启主库,再重启从库

5、登录从库配置自动定位

stop slave;
change master to master_auto_position = 1;
start slave;

三、GTID模式离线变更为传统复制(通常不会这么做)

1、等待从库追赶上主库的数据(比较Read_Master_Log_Pos和Exce_Master_Log_Pos的值,如果相等代表主从完全同步)

2、将gtid_mode=OFF的配置写入配置文件

3、在所有节点刷新日志并进行清理,在清理历史日志前建议先进行备份

flush binary logs;
show master status; #获取最新文件名,假设为000007
purge binary logs to 'mysql-bin.000007';

4、先重启主库,再重启从库

5、登录从库关闭自动定位

stop slave;
change master to relay_log_file='mysql-relay-bin.000003',relay_log_pos=375351,master_auto_position = 0; #master_pos信息可不指定,但必须指定relay信息,否则从库复制延迟后会清理掉未应用的中继日志,可能导致复制异常
start slave;

 


版权声明:本文为weixin_42073629原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42073629/article/details/117203941