MySQL主从复制中的GTID全称为Global Transaction Identifier,也就是全局事务ID,是MySQL用来唯一标识每一个数据库事务的编号,在GTID模式下,主库上执行的每一个事务都会被分配一个全局唯一的ID,从库同步时会记录已经执行过的GTID集合,避免事务重复执行。

GTID的基本结构
GTID由两部分组成,格式为source_id:transaction_id,其中source_id是生成事务的MySQL实例的UUID,每个MySQL实例启动时会自动生成一个唯一的UUID,存储在数据目录的auto.cnf文件中。transaction_id是一个从1开始递增的整数,表示该实例上执行的第N个事务。
例如一个GTID可能是3E11FA47-71CA-11E1-9E33-C80AA9429562:23,前半部分是实例UUID,后半部分表示该实例的第23个事务。
GTID的工作原理
在GTID模式的主从复制中,整个同步流程如下:
- 主库执行事务时,会为事务分配一个GTID,同时把GTID和事务操作记录到binlog中
- 从库的IO线程连接主库,拉取主库的binlog事件,其中就包含GTID信息,把这些事件写入到从库的中继日志(relay log)中
- 从库的SQL线程读取中继日志中的事务,首先会检查该事务的GTID是否已经存在于从库已执行的GTID集合中
- 如果GTID已经存在,说明该事务已经在从库执行过,SQL线程会跳过这个事务;如果不存在,就执行该事务,然后把GTID加入到从库的已执行GTID集合中
GTID与传统主从复制的差异
传统的主从复制依赖binlog的文件名和偏移量来定位同步位置,而GTID模式基于事务唯一标识来同步,两者的核心差异如下:
| 对比维度 | 传统主从复制 | GTID主从复制 |
|---|---|---|
| 同步定位方式 | 基于binlog文件名+偏移量 | 基于全局事务ID |
| 故障恢复复杂度 | 主库故障后,从库需要手动找新的同步起点,容易出错 | 从库自动识别未执行的GTID,自动同步,无需手动指定位置 |
| 事务重复执行风险 | 容易因为偏移量计算错误导致事务重复执行 | 从库自动校验GTID,避免重复执行 |
| 拓扑切换支持 | 切换主从时需要重新配置同步位置,操作繁琐 | 支持快速主从切换,新主库的GTID集合可以被从库自动识别 |
GTID模式的主从复制配置示例
以下是基于MySQL 8.0版本的GTID主从复制配置步骤,首先配置主库:
主库配置
修改主库的配置文件my.cnf,添加以下配置:
[mysqld] # 开启GTID模式 gtid_mode=ON # 强制GTID一致性,保证事务安全 enforce_gtid_consistency=ON # 开启binlog log_bin=mysql-bin # 设置server-id,主从实例的server-id必须不同 server-id=1 # 选择行格式的binlog,GTID模式推荐使用行格式 binlog_format=ROW
重启主库后,创建用于主从同步的账号:
-- 创建同步账号,允许从库连接 CREATE USER 'repl'@'192.168.0.%' IDENTIFIED BY 'repl_password'; -- 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%'; FLUSH PRIVILEGES;
从库配置
修改从库的配置文件my.cnf,添加以下配置:
[mysqld] gtid_mode=ON enforce_gtid_consistency=ON log_bin=mysql-bin server-id=2 binlog_format=ROW # 从库可选,开启只读 read_only=ON
重启从库后,配置主从同步连接:
-- 配置主库连接信息 CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_AUTO_POSITION=1; -- 开启自动定位,基于GTID同步 -- 启动从库同步 START SLAVE; -- 查看同步状态 SHOW SLAVE STATUSG
如果Slave_IO_Running和Slave_SQL_Running两个字段的值都是Yes,说明主从同步配置成功。
GTID使用注意事项
- 开启GTID模式后,
enforce_gtid_consistency必须设置为ON,否则MySQL会禁止执行可能导致GTID不一致的操作,比如CREATE TABLE ... SELECT语句 - 已经运行的传统主从复制如果要切换到GTID模式,需要平滑升级,先确保所有实例都开启GTID相关配置,再逐步切换复制模式,避免同步中断
- 从库的
gtid_purged变量记录了已经被清理的binlog对应的GTID集合,初始化从库时如果需要从已有的备份恢复,需要正确设置这个变量,避免从库重复执行已经被清理的事务
GTID是MySQL主从复制中非常重要的特性,能够大幅降低主从同步的运维复杂度,尤其是在需要频繁切换主从、做高可用架构的场景下,GTID几乎是必选的配置项。开发者在实际使用时,需要充分理解GTID的生成和同步逻辑,避免因为配置不当导致同步异常。