1.在线将传统模式复制改为 GTID 复制模式
1)在每一台服务器上设置 ENFORCE_GTID_CONSISTENCY=WARN
,设置后,所有事务都允许违反 GTID 的一致性。
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY=WARN;
注意:这一步非常重要,在进行下一步之前,需要确保在错误日志中无任何警告。
2)在每一台服务器上设置 ENFORCE_GTID_CONSISTENCY=ON
,确保所有的事务都不能违反 GTID 的一致性。
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY=ON;
3)在每一台服务器上设置 GTID_MODE=OFF_PERMISSIVE
,表示新的事务是匿名的,同时允许复制的事务是GTID或是匿名的。
SET @@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
注意:需要确保这一步操作在所有的服务器上都执行。
4)在每一台服务器上设置 GTID_MODE=ON_PERMISSIVE
,表示新的事务使用 GTID,同时允许复制的事务是 GTID 或是匿名的。
SET @@GLOBAL.GTID_MODE=ON_PERMISSIVE;
注意:需要确保这一步操作在所有的服务器上都执行。
5)等待 ONGOING_ANONYMOUS_TRANSACTION_COUNT
状态值为 0 ,表示已标记为匿名的正在进行的事务数量,如果状态值为 0 表示无事务等待被处理。
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
注意:在所有从库上查询该状态,必须要为0才能进行下一步。
6)在每一台服务器上设置 GTID_MODE=ON
,表示在所有服务器上开启 GTID。
SET @@GLOBAL.GTID_MODE=ON;
注意:需要在所有的实例上执行。
7)修改 my.cnf 的配置。
enforce_gtid_consistency=1
gtid_mode=ON
8)将复制模式从基于 binlog 位置调整为基于 GTID 模式。
STOP SLAVE;
CHANGE MASTER_AUTO_POSITION=1;
START SLAVE;
2.在线将 GTID 模式复制改为传统模式复制
1)关闭基于 GTID 模式的复制,调整为传统复制。
STOP SLAVE;
# 假设复制关闭后,复制的位置为mysql-bin.000006:123
CHANGE MASTER_AUTO_POSITION=0,MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=123;
START SLAVE;
2)在每一台服务器上设置 GTID_MODE=ON_PERMISSIVE
。
SET @@GLOBAL.GTID_MODE=ON_PERMISSIVE;
3)在每一台服务器上设置 GTID_MODE=OFF_PERMISSIVE
。
SET @@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
4)等待所有的服务器上的变量 @@GLOBAL.GTID_OWNED
为空,表示正在由线程执行的全局 GTID 集合;
5)等待所有的 SLAVE 上都复制完成匿名事务。
6)在每一台服务器关闭 GTID 。
SET @@GLOBAL.GTID_MODE=OFF;
7)修改 my.cnf 的配置。
enforce_gtid_consistency=OFF
gtid_mode=OFF