MySQL GTID 介绍

发布时间: 更新时间: 总字数:1262 阅读时间:3m 作者: IP上海 分享 网址

MySQL 的 GTID(Global Transaction Identifier,全局事务标识符) 是用于唯一标识数据库中每个事务的机制,旨在简化主从复制(Replication)的配置和维护,确保数据一致性。

介绍

核心概念和特性如下

GTID 的组成

每个 GTID 的格式为:

<source_id>:<transaction_id>
  • source_id:通常为 MySQL 服务器的 server_uuid(唯一标识符,保存在 auto.cnf 文件中),查看命令:show variables like '%server_uuid%';
  • transaction_id:事务在服务器上的递增序列号,例如:3E11FA47-71CA-11E1-9E33-C80AA9429562:23

GTID Sets

3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

GTID 集是由一个或多个单个 GTID 或 GTID 范围组成的集合。GTID 集在 MySQL 服务器中有多种用途。如:

  • gtid_executedgtid_purged 系统变量存储的值就是 GTID 集
    • gtid_executed 在全局范围内使用时,该变量包含服务器上执行的所有事务和已被 SET gtid_purged 语句设置的 GTID 的集合表示形式
    • gtid_purged 系统变量(@@GLOBAL.gtid_purged)的全局值是一个 GTID 集,由服务器上已提交的所有事务的 GTID 组成(binlog 已经被清理?)
    • GTID 保存在 mysql 数据库中名为 gtid_executed 的表中。该表中的每一行都包含其所代表的每个 GTID 或 GTID 集、源服务器的 UUID 以及该集的开始和结束事务 ID
select * from mysql.gtid_executed;
select * from mysql.gtid_purged;

START SLAVE 子句 UNTIL SQL_BEFORE_GTIDSUNTIL SQL_AFTER_GTIDS 可用于使副本只处理 GTID 集中第一个 GTID 之前的事务,或在 GTID 集中最后一个 GTID 之后停止事务。内置函数 GTID_SUBSET()GTID_SUBTRACT() 需要将 GTID 集作为输入。

GTID 的作用

  • 唯一标识事务:每个事务在全局范围内有唯一标识,避免主从复制中的重复执行
  • 简化主从配置:不再依赖二进制日志文件名和位置(如 MASTER_LOG_FILEMASTER_LOG_POS),复制自动追踪 GTID
  • 故障恢复友好:主库切换时,从库能自动定位未同步的事务,无需手动指定日志位置

GTID 的工作原理

  1. 主库执行事务:事务提交时,MySQL 生成一个 GTID 并写入二进制日志(Binlog)
  2. 从库应用事务:从库读取主库的 Binlog,记录已执行的 GTID 到 gtid_executed 系统变量中
  3. 持久化存储:GTID 信息保存在表 mysql.gtid_executed 和变量 gtid_purged 中,确保重启后仍有效

启用 GTID

在 MySQL 配置文件(如 my.cnf)中添加以下配置:

[mysqld]
# 启用 GTID
gtid_mode = ON
enforce_gtid_consistency = ON

需重启 MySQL 服务生效。

GTID 复制的优势

  • 自动定位同步点:从库通过 GTID 自动知道需要同步哪些事务
  • 简化主从切换:无需手动指定 Binlog 位置,适合高可用架构(如 MHA、InnoDB Cluster)
  • 数据一致性保障:通过 GTID 严格追踪事务,避免数据不一致或重复执行

GTID 的局限性

  • 配置复杂性:需要所有节点启用 GTID,且版本兼容(MySQL 5.6+ 支持,推荐 5.7+)
  • 事务限制:启用 enforce_gtid_consistency 后,禁止非事务性语句与事务性语句混合操作(如 CREATE TABLE ... SELECT
  • 数据清理:需谨慎处理 PURGE BINARY LOGS,避免删除未同步到从库的日志

常见操作示例

配置基于 GTID 的主从复制

  1. 主库配置
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  1. 从库配置
CHANGE MASTER TO
	MASTER_HOST = 'master_host',
	MASTER_USER = 'repl',
	MASTER_PASSWORD = 'password',
	MASTER_AUTO_POSITION = 1;  -- 启用 GTID 自动定位
START SLAVE;

查看 GTID 状态

SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'server_uuid';
SHOW MASTER STATUS\G;  -- 查看当前 GTID 执行位置

注意事项

  • 版本兼容性:MySQL 5.6 引入 GTID,5.7 和 8.0 优化了性能和管理功能
  • 备份与恢复:使用 mysqldumpxtrabackup 时需指定 --set-gtid-purged 参数
  • 跳过错误事务:可通过 SET GTID_NEXT 临时跳过特定 GTID 错误(需谨慎操作),通过 GTID,MySQL 复制变得更自动化、可靠,尤其适合复杂的高可用架构和分布式环境

参考

  1. https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html
  2. https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数