GTID的基本概念与应用
发布日期:2021-05-18 09:16:26 浏览次数:24 分类:精选文章

本文共 2522 字,大约阅读时间需要 8 分钟。

GTID全局事务标识符(Global Transaction Identifier)

GTID的基本概念

全局事务标识符(GTID)是MySQL 5.6引入的一项特性,用于为每个事务分配一个全局唯一的标识符。GTID不仅在单个实例中有效,还在主从复制环境中保持唯一性。GTID的格式为server_uuid:sequence_id,其中:

  • server_uuid:一个由32字节加上一个校验字节(/0)组成的字符串。MySQL启动时生成,并将其写入datadir目录下的auto.cnf文件。如果server_uuid丢失,MySQL会重新生成一个新的。
  • sequence_id:在binlog文件中递增且连续的整数值,用于跟踪同一server_uuid下的事务。

GTID的主要作用是确保事务的全局唯一性,从而在复制过程中避免冲突并保证数据一致性。

GTID带来的便利性

  • 定位事务来源:GTID可以帮助确定某个事务来自于哪个实例。
  • 简化主从复制:通过GTID,主从复制无需手动指定binlog文件和位点信息,复制过程更加自动化。
  • 运维管理:GTID使DBA更容易监控和管理复制关系,支持快速更换主从角色。
  • GTID在主从复制中的工作原理

  • 主库生成和记录GTID:主库执行变更操作时生成GTID,并将其记录在binlog中,以备后续复制使用。同时,主库会更新gtid_executed表,记录已执行的GTID。
  • 从库同步和应用:从库接收主库发送的binlog事件,并根据记录的gtid_next值应用事务。从库会更新自己的gtid_executed表,确保所有已执行的GTID信息准确无误。
  • GTID的持久化:在MySQL 5.7.5及以上版本,GTID信息可以通过gtid_executed表持久化存储。该表在数据库更新时会自动压缩,通过gtid_executed_compression_period参数控制压缩频率,默认每1000条记录压缩一次。
  • GTID的维护

    1. gtid_executed

    • MySQL 5.7.5之前

      • 从库必须启用binlog并设置log_slave_updates=on,以确保从库执行的GTID信息记录到binlog中。
    • MySQL 5.7.5之后

      • 新增了mysql.gtid_executed表。
      • 若不启用binlog,GTID信息会记录到gtid_executed表中。
      • 若启用binlog且log_slave_updates=on,GTID信息会同时记录到gtid_executed表和binlog日志中。

    2. gtid_executed变量

    • 该变量是一个GTID集合,存储在内存中,表示当前实例已执行的GTID事务。
    • show slave status\Gshow master status命令中的Executed_Gtid_Set值来源于此变量。

    3. gtid_purged变量

    • 该变量也是一个GTID集合,表示当前实例已丢失的(已执行过的)GTID事务。
    • 当purge命令或expire_logs_days参数删除历史binlog文件时,会清空gtid_purged中的信息。
    • 从库可以手动指定gtid_purged值,表示从库已执行了哪些GTID,从而重新开始复制。

    4. gtid_mode参数

    GTID模式值 含义
    ON 新事务为GTID事务,且只能复制GTID事务
    ON_PERMISSIVE 新事务为GTID事务,同时可复制GTID或匿名事务
    OFF_PERMISSIVE 新事务为匿名事务,同时可复制GTID或匿名事务
    OFF 新事务为匿名事务,且只能复制匿名事务

    5. enforce_gtid_consistency参数

    含义
    不允许任何交易违反GTID一致性 ON
    允许交易违反GTID一致性但生成警告 WARN
    允许所有交易违反GTID一致性 OFF

    GTID模块初始化及binlog_gtid_simple_recovery参数

    • GTID模块在初始化时会读取binlog_gtid_simple_recovery参数,默认值为ON。该参数用于快速定位GTID信息,建议保留默认设置。

    GTID的应用

    1. 搭建主从复制

    参数设置

    • server_id:主从库的server_id必须不同。
    • log_bin:主库必须启用binlog。
    • binlog_format=row:建议使用行模式。
    • gtid_mode=on:启用GTID模式。
    • log_slave_updates=on:在MySQL 5.6及以上版本中,控制GTID信息持久化介质。

    配置修改

    CHANGE MASTER TO 
    MASTER_HOST='master2.example.com',
    MASTER_USER='replication',
    MASTER_PASSWORD='password',
    MASTER_PORT=3306,
    MASTER_AUTO_POSITION=1;

    2. GTID复制架构到传统复制架构的转换

  • 停止主从复制:

    stop slave;
  • 修改当前复制为传统模式:

    change master to 
    master_log_file='binlog.000005',
    master_log_pos=1968,
    master_auto_position=0;
  • 启动复制:

    start slave;
  • 检查复制状态:

    show slave status\G
  • GTID的限制

    GTID对事务一致性的要求使得以下场景不支持:

  • 事务包含对多个存储引擎的查询更新,会导致多个GTID分配。
  • 主从库存储引擎不一致,可能导致数据不一致。
  • 使用CREATE TABLE ... SELECT语句会生成两个事务,可能导致数据不一致。
  • 只有在autocommit=1时,才能支持CREATE TEMPORARY TABLEDROP TEMPORARY TABLE语句。
  • 在GTID模式下,建议避免使用mysql_upgrade工具进行升级,以免导致数据不一致。

    上一篇:redo、undo的理解
    下一篇:如何离线安装所有依赖包

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2025年04月28日 03时03分44秒