MySQL主从复制(9)传统复制模式切换GTID复制模式
在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变量有ON、ON_PERMISSIVE、OFF_PERMISSIVE、OFF四个值:
1、gtid_mode=OFF:主库生成匿名事务,从库也只能应用匿名事务,即从库的gtid_mode应该是OFF或OFF_PERMISSIVE
2、gtid_mode=OFF_PERMISSIVE:主库事务为匿名事务,从库接受匿名事务或GTID事务,但不允许仅GTID模式。即从库gtid_mode可以为OFF、OFF_PERMISSIVE或ON_PERMISSIVE
3、gtid_mode=ON_PERMISSIVE:主库事务是GTID事务,从库接受匿名事务或GTID事务。即从库gtid_mode可以为OFF_PERMISSIVE、ON_PERMISSIVE或ON
4、gtid_mode=ON:主库从库都只能应用GTID事务,即主为ON,从为ON_PERMISSIVE或ON
· 在修改gtid_mode变量的值时,必须遵守兼容顺序逐级调整(ON --> ON_PERMISSIVE --> OFF_PERMISSIVE --> OFF或相反顺序)。主库确定某个取值后从库只能取相同的值或该值临近两侧的值。例如主库是ON_PERMISSIVE,那么从库可以是ON、ON_PERMISSIVE、OFF_PERMISSIVE,但不能是OFF;主库是ON,那么从库可以是ON、ON_PERMISSIVE,但不能是OFF_PERMISSIVE、OFF。即“在主从都是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复制(每一步操作都会刷新binlog)
1、在每个节点开启GTID的一致性告警,然后观察1-2分钟看每个节点的错误日志是否有warning信息,如果有则需要根据日志进行调整
mysql > set global enforce_gtid_consistency = WARN;
2、如果每个节点都没有出现warn信息,则在每个节点开启GTID一致性配置,此时违反GTID的操作都无法再执行,如create table as select
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、等待匿名事务全部应用完成,确保主从节点ONGOING_ANONYMOUS_TRANSACTION_COUNT统计值为0,否则强行更改会导致数据丢失。
SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT' #确保值为0
show slave status #确保Executed_Gtid_Set正常增长
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、登录从库配置自动定位
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;
评论