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_executed
和 gtid_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_GTIDS
和 UNTIL SQL_AFTER_GTIDS
可用于使副本只处理 GTID 集中第一个 GTID 之前的事务,或在 GTID 集中最后一个 GTID 之后停止事务。内置函数 GTID_SUBSET()
和 GTID_SUBTRACT()
需要将 GTID
集作为输入。
GTID 的作用
唯一标识事务
:每个事务在全局范围内有唯一标识,避免主从复制中的重复执行
简化主从配置
:不再依赖二进制日志文件名和位置(如 MASTER_LOG_FILE
和 MASTER_LOG_POS
),复制自动追踪 GTID
故障恢复友好
:主库切换时,从库能自动定位未同步的事务,无需手动指定日志位置
GTID 的工作原理
主库执行事务
:事务提交时,MySQL 生成一个 GTID 并写入二进制日志(Binlog)
从库应用事务
:从库读取主库的 Binlog,记录已执行的 GTID 到 gtid_executed
系统变量中
持久化存储
: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 的主从复制
主库配置
:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
从库配置
:
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 优化了性能和管理功能
备份与恢复
:使用 mysqldump
或 xtrabackup
时需指定 --set-gtid-purged
参数
跳过错误事务
:可通过 SET GTID_NEXT
临时跳过特定 GTID 错误(需谨慎操作),通过 GTID,MySQL 复制变得更自动化、可靠,尤其适合复杂的高可用架构和分布式环境