MySQL在线开启或禁用GTID模式

 更新时间:2021年11月28日 14:46:54   作者:ZhenXing_Yu  
本文详细讲解了MySQL在线开启或禁用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时,只会在错误日志提示,不会直接报错,

## 该操作在主从库均执行
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

2. 设置GTID校验ENFORCE_GTID_CONSISTENCY为ON

观测一段时间(严谨的情况可能观测一天以上),确认上一个步骤未在错误日志中出现相关Warning信息后,正式开启GTID一致性校验,当设置为ON后,如果再执行CREATE TABLE AS SELECT语句则会直接报错

## 该操作在主从库均执行
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

确保回放线程回放的事务都已是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

自行判断命令在主库还是从库执行

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

SET @@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

以上所述是小编给大家介绍的MySQL在线开启或禁用GTID模式,希望对大家有所帮助。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • MySQL group by分组后如何将每组所得到的id拼接起来

    MySQL group by分组后如何将每组所得到的id拼接起来

    这篇文章主要介绍了MySQL group by分组后如何将每组所得到的id拼接起来,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • MYSQL数据库连接池及常见参数调优方式

    MYSQL数据库连接池及常见参数调优方式

    这篇文章主要介绍了MYSQL数据库连接池及常见参数调优方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Mysql中强制索引的具体使用

    Mysql中强制索引的具体使用

    Mysql强制索引可以通过强制使用某些列的索引来提高查询的性能,本文就来介绍一下Mysql中强制索引的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • mysql5.6建立索引报错1709问题及解决

    mysql5.6建立索引报错1709问题及解决

    这篇文章主要介绍了mysql5.6建立索引报错1709问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 简单了解mysql方言dialect

    简单了解mysql方言dialect

    这篇文章主要介绍了简单了解数据库方言dialect,数据库方言也是如此,MySQL 是一种方言,Oracle 也是一种方言,MSSQL 也是一种方言,他们之间在遵循 SQL 规范的前提下,都有各自的扩展特性,需要的朋友可以参考下
    2019-07-07
  • Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录

    Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录

    这篇文章主要介绍了Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录,需要的朋友可以参考下
    2017-07-07
  • Mysql主从同步如何重置

    Mysql主从同步如何重置

    在MySQL数据库运维中,遇到主从数据库数据不一致时需要进行同步重置,本文介绍了主从同步重置的具体步骤:首先对从库操作,包括停止slave、重置从库;其次对主库进行操作,包括重置主库同步设置、锁定主库;最后从库导入主库数据
    2024-10-10
  • MySQL之使用UNION和UNION ALL合并两个或多个SELECT语句的结果集

    MySQL之使用UNION和UNION ALL合并两个或多个SELECT语句的结果集

    这篇文章主要介绍了MySQL之使用UNION和UNION ALL合并两个或多个SELECT语句的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL数据库约束操作示例讲解

    MySQL数据库约束操作示例讲解

    约束是用来限制表中的数据长什么样子的,即什么样的数据可以插入到表中,什么样的数据插入不到表中,下面这篇文章主要给大家介绍了关于如何通过一文理解MySQL数据库的约束与表的设计的相关资料,需要的朋友可以参考下
    2022-11-11
  • MYSQL中 char 和 varchar的区别

    MYSQL中 char 和 varchar的区别

    这篇文章主要介绍了MYSQL中 char 和 varchar的区别,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09

最新评论