• MySQL 在线开启 GTID


    描述

    生产环境上也会遇到需要开启 GTID ,有什么风险?如何在线开启?本篇文章将介绍。

    GTID 限制

    由于基于 GTID 复制依赖于事务,所有开启 GTID 时,有些 MySQL 特性不支持:

    • 事务中混合多个存储引擎。
    • 主从库表引擎不一致,会导致数据不一致。
    • 不支持 CREATE. TABL…SELECT。
    • 不支持 CREATE TEMPORARY TABLE 和 DROP EMPORARY TABLE。

    PS:详细可参考 Restrictions on Replication with GTIDs

    参数介绍

    开启 GTID 我们一般会关注 gtid_modeenforce_gtid_consistency两个参数。

    enforce_gtid_consistency

    当 GTID 开启后,一个事物分配一个 GTID 保护 GTID 一致性,对某些 SQL 会有限制,例如 CREATE TABLE … SELECT 必须得分成两条语句执行。该参数有三个有效值:OFF / ON / WARN

    • OFF:表示事务允许违反 GTID 一致性。
    • ON:表示事务不允许违反 GTID 一致性,有相关 SQL 会直接返回异常。
    • WARN:表示事务允许违反 GTID 一致性,但会将警告信息记录到 ERROR LOG。

    gtid_mode

    GTID 模式设置,该参数有四个有效值:

    • OFF:表示生成的是匿名事务,从库只能应用匿名事务。
    • OFF_PERMISSIVE:新产生的事务都是匿名事务,但也允许有 GTID 事务被复制同步。
    • ON_PERMISSIVE:新产生的都是 GTID 事务,但也允许有匿名事务被复制同步。
    • ON:新生成的是 GTID 事务,从库只能应用 GTID 事务。

    从参数给出的有效值来看,可以使用其平滑开启 GTID 模式,OFF_PERMISSIVE就是为平滑关闭 GTID 准备的。只有当 enforce_gtid_consistency = ON才允许 gtid_mode被设置为 ON。每一次修改 gtid_mode都会导致 binary log 发生一次切换,建议业务低峰操作。

    在线开启

    校验是否可以开启

    首先你需要在每台实例上执行该命令,然后观察错误日志,是否有异常。业务有使用违反 GTID 一致性的语法会被记录到错误日志中,如果直接改为 ON 发现时可能已经影响到了业务。

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
    
    • 1

    观察一段时间,确认错误日志无警告信息,即可开启该参数。

    SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
    
    • 1

    开启该参数后,所有违反 GTID 一致性的 SQL 都会被拒绝。

    设置 GTID_MODE

    如果直接修改 GTID_MODE = ON 会报如下错误:

    ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
    
    • 1

    我们需要先设置 GTID_MODE 为 OFF_PERMISSIVE:
    如刚才对该值的描述,是一个关闭 GITD 的过渡属性,执行完可快速进入下一步。

    -- 该操作在主从库均执行
    SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
    
    • 1
    • 2

    再设置 GTID_MODE 为 ON_PERMISSIVE:
    该操作依旧是一个过渡属性,其表示的则是新产生的都是 GTID 事务,但也允许有匿名事务被复制,从这个阶段开始就已经是一个正式转化的过程,但依旧是对两种事务做兼容。

    -- 该操作在主从库均执行
    SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
    
    • 1
    • 2

    确认匿名事务回放完毕:
    确保该状态值输出的匿名事务数显示为 0 只要出现过 0 即可表示转换完成。

    -- 该操作在从库执行
    SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
    
    • 1
    • 2

    刷新 BINLOG:
    触发 BINLOG 切换,保证一个 BINLOG 文件中只包含一种事物类型。

    -- 该操作仅在主库执行即可
    FLUSH LOGS;
    
    • 1
    • 2

    设置 GTID_MODE 为 ON:

    SET @@GLOBAL.GTID_MODE = ON;
    
    • 1

    修改复制模式为 GTID:

    -- 停止复制
    STOP SLAVE;
    
    -- 修改为 GTID 模式
    CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
    
    -- 开启复制
    START SLAVE;
    
    -- 复制同步状态
    SHOW SLAVE STATUS\G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    写入配置文件

    gtid_mode = on
    enforce_gtid_consistency = on
    
    • 1
    • 2

    总结

    开启 GTID_MODE 必须设置 enforce_gtid_consistency = ON评估该参数对业务是否有影响,非常重要。

  • 相关阅读:
    C++:基于文件流拷贝文件(附完整源码)
    基于公共业务提取的架构演进——外部依赖防腐篇
    centos7最简洁的搭建samba服务器
    java 检查异常与非检查异常
    【Linux基础】2.2 运行级别、找回root密码、帮助、文件目录、查看文件,重定向,查看历史指令
    Java常用17个工具类方法,提升开发效率的“轮子”,避免重复造轮子
    2023年【危险化学品生产单位主要负责人】试题及解析及危险化学品生产单位主要负责人模拟试题
    隆云通管道温湿度传感器
    浅谈图片宽度自适应解决方案
    【Azure Batch】在批处理的Task中如何让它执行多个CMD指令呢
  • 原文地址:https://blog.csdn.net/qq_42768234/article/details/125524752