MySQL 5.7 在线更改gtid_mode

在MySQL 5.7.6以前,gtid_mode是只读参数,修改值只能通过重启实例生效。
在MySQL 5.7.6开始,gtid_mode支持在线动态修改。
在MySQL里事务分为两种,一种是匿名事务(anonymous),一种是GTID事务。GTID事务即该事务带有GTID信息,而匿名事务即使没有GTID信息的事务,在主从复制中只能指定binlog文件和位点的方式来搭建。
从MySQL 5.7.6开始,gtid_mode有以下四个值:
OFF,主库所有新启的事务以及从库的事务都要求是匿名事务;例如主库发起事务A,那么这个事务没有GTID信息,相关binlog传到从库,由从库复制该事务时,从库开启的这个事务也必须是匿名的,从库的gtid_mode也应该是OFF或OFF_PERMISSIVE;
OFF_PERMISSIVE,主库新启的事务是匿名事务,但从库事务允许是匿名的或者是GTID事务,但不允许只是GTID模式;即从库的gtid_mode需要是ON_PERMISSIVE或OFF_PERMISSIVE或OFF;
ON_PERMISSIVE,主库新启的事务是GTID事务,从库事务允许是匿名的或者是GTID事务;即从库的gtid_mode需要是ON或ON_PERMISSIVE或OFF_PERMISSIVE;
ON,主库新启的事务是GTID事务,从库的事务也要求是GTID事务,即若主为ON,那么从库的gtid_mode应该要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,需要怎么操作呢?
1.主从两边都设置gtid_mode=OFF_PERMISSIVE;
2.主从两边都设置gtid_mode=ON_PERMISSIVE;
3.检查SHOW STATUS LIKE ‘ONGOING_ANONYMOUS_TRANSACTION_COUNT’,直到输出值为0,意思是匿名事务都已经应用完了。否则后面设置master_auto_position=1会报错Cannot replicate anonymous transaction when AUTO_POSITION = 1
4.主从两边设置gtid_mode=ON;
5.change master to master_auto_position=1。

同理,主从都是gtid_mode=ON的情况下,想要关闭GTID模式,应该如下操作:
1.主从两边都设置gtid_mode=ON_PERMISSIVE;
2.主从两边都设置gtid_mode=OFF_PERMISSIVE;
3.检查SELECT @@GLOBAL.GTID_OWNED,直到输出值为空;
4.主从两边都设置gtid_mode=OFF;
5.需要修改主从复制模式为binlog文件和位点的方式,最好在修改gtid_mode之前先调整好。

你可能感兴趣的:(MySQL)