MySQL 5.7 GTID主从必须主从均启用gtid_mode=ON、enforce_gtid_consistency=ON、log_slave_updates=ON,且server_id唯一、binlog_format=ROW;需用MASTER_AUTO_POSITION=1配置复制,严禁混用传统pos方式。

必须先确认 MySQL 5.7 已正确安装并运行,且主从库时间同步、网络互通;否则 gtid_mode=on 启动会失败,或复制启动后立即报错 ERROR 1794 (HY000)。
确认 MySQL 5.7 版本与 GTID 支持能力
Ubuntu 20.04 默认源只提供 MySQL 8.0,直接 apt install mysql-server 装不到 5.7。必须换源或手动安装 deb 包:
- 换清华源后添加
mysql-apt-config并指定mysql-5.7源,再执行apt install mysql-server=5.7.*-1ubuntu20.04 - 或下载官方
mysql-server_5.7.42-1ubuntu18.04_amd64.deb-bundle.tar(兼容 Ubuntu 20.04),用dpkg -i逐个安装(注意依赖:先装libtinfo5和libmecab2) - 装完验证:
mysql --version输出应为mysql Ver 14.14 Distrib 5.7.42,且SELECT VERSION();在 MySQL 内也返回一致版本
低于 5.7.6 的版本不支持 GTID 动态开启,必须重启生效;5.7.6+ 才能在线设置 SET GLOBAL gtid_mode = ON_PERMISSIVE;,但生产环境仍建议静态配置。
主从 my.cnf 必须同时启用的 GTID 参数
主库和从库的 /etc/mysql/mysql.conf.d/mysqld.cnf(或 /etc/mysql/my.cnf)中,以下三项必须显式配置且值一致:
-
gtid_mode = ON—— 不可设为ON_PERMISSIVE或OFF_PERMISSIVE,否则START SLAVE会拒绝 -
enforce_gtid_consistency = ON—— 否则任何含临时表、非事务引擎、存储过程等操作都会被拒绝,且gtid_mode=ON无法生效 -
log_slave_updates = ON—— 从库必须写 relay log 到自己的 binlog,否则级联复制或故障切换时丢失 GTID 连续性
另外两个关键参数常被遗漏:
-
server_id必须全局唯一(主库设1,从库设2等),不能为0或重复 -
binlog_format = ROW—— GTID 要求必须是ROW模式,MIXED或STATEMENT会导致复制中断
改完配置后,务必 systemctl restart mysql,并检查错误日志:tail -n 20 /var/log/mysql/error.log,确认无 GTID 相关警告或拒绝加载。
创建复制账号并执行 CHANGE MASTER TO master_auto_position=1
在主库执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
在从库上执行 CHANGE MASTER TO 时,**绝不能**用 MASTER_LOG_FILE 和 MASTER_LOG_POS,必须用 GTID 方式:
- 先确保从库没有残留复制状态:
STOP SLAVE; RESET SLAVE ALL; - 执行:
CHANGE MASTER TO MASTER_HOST='192.168.9.71', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='StrongPass123!', MASTER_AUTO_POSITION=1; - 启动:
START SLAVE;
验证是否真正走 GTID 复制:SHOW SLAVE STATUS\G 中检查:
-
Auto_Position: 1(不是0) -
Retrieved_Gtid_Set和Executed_Gtid_Set非空且逐渐增长 -
Seconds_Behind_Master: 0(初始同步完成后)
常见卡点:传统模式残留导致 START SLAVE 失败
如果之前配过传统复制(binlog + pos),即使执行了 RESET SLAVE ALL,也可能因 mysql.gtid_executed 表残留或 relay_log.info 文件未清空而报错:
- 错误
ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread:先STOP SLAVE IO_THREAD;再RESET SLAVE ALL; - 错误
ERROR 1794 (HY000): ... The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires:说明主库binlog已被清理,从库缺失的 GTID 找不到了,只能重做从库(mysqldump --all-databases --single-transaction --set-gtid-purged=ON导出再导入) - 从库
SHOW SLAVE STATUS中Slave_IO_Running: No且Last_IO_Error提到Could not find first log file name in binary log index file:说明master_info_repository = TABLE未配置,或relay_log_info_repository = TABLE缺失,这两个参数在 GTID 模式下必须设为TABLE(而非默认FILE)
GTID 最难调试的地方不在配置本身,而在「一致性前提」——主从必须从同一个 GTID 集合起点开始同步,任何人为跳过、手工修改 gtid_purged、或跨版本混用 binlog,都会让 GTID 自动定位彻底失效。


















