GTID(Global Transaction Identifier,全局事务标识符)是 MySQL 数据库在主从复制中引入的核心机制,用于唯一标识全局事务,简化复制管理和故障转移流程。其核心概念与工作机制如下:
GTID 由两部分构成:source_id:transaction_id
。
source_id
:即 MySQL 实例的唯一标识 server_uuid
(首次启动时生成,存储在 auto.cnf
文件中)。transaction_id
:事务在实例上的顺序号,从 1 开始单调递增。示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
。
同一事务的 GTID 在整个复制拓扑中保持不变,即使经过多级主从(如 主库 → 从库 A → 从库 B)。
主库提交事务时生成 GTID,并将其写入 Binlog 头部(通过 GTID_Event
事件)。
gtid_executed
集合:
从库通过 MASTER_AUTO_POSITION=1
向主库发送已执行的 GTID 集合,主库自动推送缺失的事务。
特性 | 传统复制 | GTID 复制 |
---|---|---|
故障切换 | 需手动定位 Binlog 文件和位置点 | 自动匹配 GTID,无需人工干预 |
数据一致性 | 可能重复执行事务(如位置点配置错误) | 通过 GTID 唯一性避免重复执行 |
配置复杂度 | 需指定 MASTER_LOG_FILE 和 POS |
仅需 MASTER_AUTO_POSITION=1 |
多级复制管理 | 复杂,需逐级传递位置点 | 自动跟踪事务路径,简化级联复制 |
CREATE TABLE ... SELECT
、临时表操作(在 enforce_gtid_consistency=ON
模式下)。gtid_mode=ON
)。log-bin=ON
)和 log-slave-updates
(级联复制时)。auto.cnf
以生成新 UUID。在 my.cnf
添加:
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=mysql-bin
重启 MySQL 服务生效。
STOP SLAVE;
SET GTID_NEXT='aaa-bbb:100'; -- 指定需跳过的GTID
BEGIN; COMMIT; -- 注入空事务
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
SHOW SLAVE STATUS\G;
-- 关键指标:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Retrieved_Gtid_Set: 已接收的GTID
-- Executed_Gtid_Set: 已执行的GTID
GTID 通过全局唯一事务标识和自动位置跟踪,显著提升了 MySQL 复制的可靠性与运维效率,尤其适用于大规模集群和故障切换场景。其核心价值在于:
注: 对 MySQL 5.7+ 环境,建议优先使用 GTID 复制;若需兼容旧版本或特殊操作,可评估传统复制方案。