MySQL|MySQL 在线开启&关闭GTID模式

MySQL 在线开启&关闭GTID模式
目录

  • MySQL 在线开启&关闭GTID模式
    • 基本概述
    • 在线开启GTID
      • 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY为WARN
      • 2. 设置GTID校验ENFORCE_GTID_CONSISTENCY为ON
      • 3. 设置GTID_MODE为OFF_PERMISSIVE
      • 4. 设置GTID_MODE为ON_PERMISSIVE
      • 5. (关键点)确保匿名事务回放完毕
      • 6. 触发一轮日志切换FLUSH LOGS
      • 7. 正式开启GTID_MODE为ON
      • 8. 修改配置文件确保GTID参数持久化
      • 9. 修改复制模式为GTID方式
    • 在线关闭GTID
      • 1. 将复制改为基于POS点方式
      • 2. 设置GTID_MODE为ON_PERMISSIVE
      • 3. 设置GTID_MODE为OFF_PERMISSIVE
      • 4. (关键点)确保GTID事务回放完毕
      • 5. 触发FLUSH LOGS
      • 6. 设置GTID_MODE为OFF
      • 7. 设置ENFORCE_GTID_CONSISTENCY为OFF
      • 8. 修改my.cnf配置文件中GTID相关参数为OFF
    • 命令简版
      • 1. 在线开启GTID
      • 2. 在线关闭GTID
    • 参考链接

基本概述
我们知道MySQL有2种方式指定复制同步的方式,分别为:
  1. 基于binlog文件名及位点的指定方式
    - 匿名事务(Anonymous_gtid_log_event)
  2. 基于GTID(全局事务ID)的指定方式
    - GTID事务(Gtid_log_event)
而基于GTID的方式一方面在一主多从的架构下主从切换有着明显优势外,对于日常复制异常的故障诊断方面也更为方便,从MySQL 5.7.6之后便开始支持动态开启和关闭GTID模式,其参数GTID_MODE有以下取值
  • OFF - 只允许匿名事务被复制同步
  • OFF_PERMISSIVE - 新产生的事务都是匿名事务,但也允许有GTID事务被复制同步
  • ON_PERMISSIVE - 新产生的都是GTID事务,但也允许有匿名事务被复制同步
  • ON - 只允许GTID事务被复制同步
在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY为WARN
该操作的目的是允许在主库执行的SQL语句违反GTID一致性校验,且只在主库的错误日志中输出warning级别日志以作提醒,目的是为了考虑如果复制方式改为GTID模式后应用程序不会因为GTID的一些限制导致异常报错,
  • 如:使用CREATE TABLE AS SELECT语法在GTID模式下不支持,而ENFORCE_GTID_CONSISTENCY设置为WARN时,只会在错误日志提示,不会直接报错,
    MySQL|MySQL 在线开启&关闭GTID模式
    文章图片
## 该操作在主从库均执行 SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

2. 设置GTID校验ENFORCE_GTID_CONSISTENCY为ON
观测一段时间(严谨的情况可能观测一天以上),确认上一个步骤未在错误日志中出现相关Warning信息后,正式开启GTID一致性校验,当设置为ON后,如果再执行CREATE TABLE AS SELECT语句则会直接报错
MySQL|MySQL 在线开启&关闭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事务,但也允许有匿名事务被复制
## 该操作在主从库均执行 SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

5. (关键点)确保匿名事务回放完毕
该步骤的目的是确保在正式转换为完整的GTID模式前,老的匿名事务均以被回放完毕,确保GTID_MODE设置为ON时,不会因为残留的匿名事务导致复制同步报错,有以下2种方式进行校验
## 该操作仅在从库执行即可 ## 方式1:确保该状态值输出的匿名事务数显示为0(注意:只要出现过0即可表示已经转换完成,即使后续该状态值从0变为了大于0的值也不影响) SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; ## 在从库上多次执行该语句 ## 方式2: 查询该视图中LAST_SEEN_TRANSACTION可以观测当前同步的事务是否还存在ANONYMOUS事务 select * from performance_schema.replication_applier_status_by_worker;

确保匿名事务数为0
MySQL|MySQL 在线开启&关闭GTID模式
文章图片

确保回放线程回放的事务都已是GTID事务
MySQL|MySQL 在线开启&关闭GTID模式
文章图片

6. 触发一轮日志切换FLUSH LOGS
该操作的目的是为了在主库触发binlog的轮换,使新生成的binlog都是包含GTID的事务(防止一个binlog中包含2种类型的事务日志)
## 该操作仅在主库执行即可 FLUSH LOGS;

7. 正式开启GTID_MODE为ON
正式开启GTID
## 该操作在主从库均执行 SET @@GLOBAL.GTID_MODE = ON; SELECT @@GTID_MODE,@@ENFORCE_GTID_CONSISTENCY;

8. 修改配置文件确保GTID参数持久化
在my.cnf配置文件中增加GTID参数,确保重启不会失效,该操作也可在第一步进行
## 该操作在主从库均执行 gtid-mode= ON enforce-gtid-consistency= 1

9. 修改复制模式为GTID方式
将复制模式从基于POS点改为基于GTID
## 停止复制 STOP SLAVE; ## 修改为GTID模式 CHANGE MASTER TO MASTER_AUTO_POSITION = 1; ## 开启复制 START SLAVE; ## 观测复制同步状态 SHOW SLAVE STATUS\G

在线关闭GTID
方式类似于在线开启GTID的逆向操作,以下只写出步骤和具体命令,不做详细解释
  1. 先将GTID模式的复制改为基于POS点的复制
  2. 设置GTID_MODE为ON_PERMISSIVE
  3. 设置GTID_MODE为OFF_PERMISSIVE
  4. 观测GTID_OWNED状态变量变为空值及replication_applier_status_by_worker表中事务均转为匿名事务
  5. 触发FLUSH LOGS
  6. 设置GTID_MODE为OFF
  7. 设置ENFORCE_GTID_CONSISTENCY为OFF
  8. 修改my.cnf配置文件中GTID相关参数为OFF
1. 将复制改为基于POS点方式
stop slave; show slave status\G## 取show slave status\G中的Master_Log_File和Exec_Master_Log_Pos填入 CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=224126137; start slave; show slave status\G

2. 设置GTID_MODE为ON_PERMISSIVE
## 该操作在主从库均执行 SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

3. 设置GTID_MODE为OFF_PERMISSIVE
## 该操作在主从库均执行 SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

4. (关键点)确保GTID事务回放完毕
观测GTID_OWNED状态变量变为空值及replication_applier_status_by_worker表中事务均转为匿名事务
## 该操作在从库执行即可 SELECT @@GLOBAL.GTID_OWNED; select * from performance_schema.replication_applier_status_by_worker;

5. 触发FLUSH LOGS
## 该操作在主库执行即可 FLUSH LOGS;

6. 设置GTID_MODE为OFF
## 该操作在主从库均执行 SET @@GLOBAL.GTID_MODE = OFF;

7. 设置ENFORCE_GTID_CONSISTENCY为OFF
## 该操作在主从库均执行 SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF;

8. 修改my.cnf配置文件中GTID相关参数为OFF
## 该操作在主从库均执行 gtid-mode= OFF enforce-gtid-consistency= 1

命令简版 1. 在线开启GTID
自行判断命令在主库还是从库执行
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN; SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON; SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE; SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT'; select * from performance_schema.replication_applier_status_by_worker; FLUSH LOGS; SET @@GLOBAL.GTID_MODE = ON; ## 配置文件修改 gtid-mode= ON enforce-gtid-consistency= 1## 将复制模式从基于POS点改为基于GTID STOP SLAVE; CHANGE MASTER TO MASTER_AUTO_POSITION = 1; START SLAVE; SHOW SLAVE STATUS\G

2. 在线关闭GTID
【MySQL|MySQL 在线开启&关闭GTID模式】自行判断命令在主库还是从库执行
stop slave; show slave status\G## 取show slave status\G中的Master_Log_File和Exec_Master_Log_Pos填入 CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE='mysql-bin.000017', MASTER_LOG_POS=224126137; start slave; show slave status\GSET @@GLOBAL.GTID_MODE = ON_PERMISSIVE; SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE; SELECT @@GLOBAL.GTID_OWNED; select * from performance_schema.replication_applier_status_by_worker; FLUSH LOGS; SET @@GLOBAL.GTID_MODE = OFF; SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF; ## 修改my.cnf配置文件中GTID相关参数为OFF gtid-mode= OFF enforce-gtid-consistency= 1

参考链接
  • https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online.html
    • https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-enable-gtids.html
    • https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-disable-gtids.html

    推荐阅读