1.GTID
mysql主从同步有两种机制,一种是基于binlog文件名及位点的同步方式:匿名事务:Anonymous_gtid_log_event;
另外一种是指定全局事务ID:Gtid_log_event;
基于GTID的方式在一主多从切换有着明显优势外,对于日常复制异常的故障诊断也更为方便。
在日常运维或升级过程中,免不了要做GTID的开启或关闭。
MySQL5.7.6之后开始支持动态开启和关闭GTID。取值如下:
OFF:只允许匿名事务被复制同步。
OFF_PERMISSIVE:新产生的事务都是匿名事务,但也允许有GTID事务被复制同步。
ON_PERMISSIVE:新产生的事务都是GTID事务,但也允许有匿名事务被复制同步。
ON :只允许GTID事务被复制同步。
可以看出,在线修改GTID,是逐渐将匿名事务转化为GTID事务过程。
2.在线开启GTID
(1)设置GTID 校验 ENFORCE_GTID_CONSISTENCY=WARN;
该操作的目的是允许在主库执行的SQL语句违反GTID一致性校验,且只在主库的错误日志中输出WARNING
级别以上做提醒。
CREATE TABLE AS SELECT 语法在GTID模式下不支持,在MYSQL8.0.21以后GTID模式下也支持。该语法变为了一个特殊
的原子性DDL;
#主从均执行。
set @@global.enforce_gtid_consistency=warn;
只会在错误日志出现警告,但不会报错。
(2)设置GTID校验 ENFORCE_GTID_CONSISTENCY=ON;
确认上一个步骤未在错误日中出现相关WARNING信息后,正式开启GTID一致性校验,当设置为ON后。
如果再执行 CREATE TABLE AS SELECT 会直接报错。(MySQL5.7)
mysql> set @@global.enforce_gtid_consistency=warn;
Query OK, 0 rows affected (0.00 sec)
mysql> set @@global.enforce_gtid_consistency=on;
Query OK, 0 rows affected (0.00 sec)
mysql> create table t2 as select * from t1;
Query OK, 0 rows affected (12.26 sec)
(3)设置 GTID_MODE=OFF_PERMISSIVE;
该操作表示新产生的事务依旧是匿名事务,但也允许有GTID事务被复制同步。对于在线开启GTID模式而言。
该步骤就是一个单纯的过渡属性。
SET @@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
(4)GTID_MODE 为 ON_PERMISSIVE;
表示新产生的都是GTID事务,但也允许有匿名事务被复制。从这个阶段开始,就是一个正式转换的过程。
但依旧兼容这两种事务。
SET @@GLOBAL.GTID_MODE=ON_PERMISSIVE;
(5)确保匿名事务回放完毕。
该步骤的目的是确保在正式转换为完整的GTID模式前,老的匿名事务均已被回放完毕。确保GTID_MODE 设置为ON;
不会因为残留的匿名事务导致复制同步报错。
#仅在从库执行。
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
只要出现过0即可表示已经转换完毕,即便后续该状态从0变为非0也不影响。
#方法二:在从库上多次执行:
select * from performance_schema.replication_applier_status_by_worker;
该视图中: LAST_SEEN_TRANSACTION 可以观察当前同步的事务是否还存在ANONYMOUS事务。
(6)进行日志切换
flush logs;
该操作的目的是为了在主库触发binlog的轮换,使得新生成的binlog 都是包含GTID的事务。防止
一个binlog中包含2种类型的事务日志。
(7)正式开启gtid_mode=on;
SET @@GLOBAL.GTID_MODE=ON;
SELECT @@GTID_MODE,@@ENFORCE_GTID_CONSISTENCY;
mysql> SET @@GLOBAL.GTID_MODE=ON;
Query OK, 0 rows affected (1.69 sec)
mysql> SELECT @@GTID_MODE,@@ENFORCE_GTID_CONSISTENCY;
+-------------+----------------------------+
| @@GTID_MODE | @@ENFORCE_GTID_CONSISTENCY |
+-------------+----------------------------+
| ON | ON |
+-------------+----------------------------+
1 row in set (0.00 sec)
(8)修改参数文件
vim my.cnf
[mysqld]
gtid_mode=on
enforce_gtid_consistency=1
(9)修改复制模式为GTID方式
在开启GTID模式后,我们要将基于点位复制模式改为基于GTID模式。
STOP SLAVE;
CHANGE MASTER TO MASTER_AUTO_POSISION=1;
START SLAVE;
SWOH SLAVE STATUS\G;