必须主从两端同时开启gtid_mode=on且enforce_gtid_consistency=on,均写入[mysqld]段并重启生效;否则start slave必失败,且需用mysqldump --set-gtid-purged=on导入数据确保gtid一致。

必须主从两端同时开启 gtid_mode = ON,且配置写入 [mysqld] 段并重启生效,否则 START SLAVE 一定失败。
主从两端的 gtid_mode 必须严格一致
MySQL 5.7 的 GTID 复制不是“一端开就行”的功能。只要主库是 ON、从库是 OFF(或 OFF_PERMISSIVE),执行 CHANGE MASTER TO ... MASTER_AUTO_POSITION = 1 就会报错:ERROR 1777 (HY000): CHANGE MASTER TO requires MASTER_AUTO_POSITION = 1 when gtid_mode = ON。这不是语法错误,而是协议拒绝。
-
SHOW VARIABLES LIKE 'gtid_mode';要在主、从上**分别执行**,不能只查一端 -
gtid_mode = on、gtid_mode = ON都合法;但gtid_mode = 1或gtid_mode = true会被 mysqld 启动时静默忽略 - 配置若写在
[client]段,完全不生效;写在[mysqld]外的空白行也无效 - 仅用
SET GLOBAL gtid_mode = ON;不持久,重启后回退 —— 必须写进配置文件或用SET PERSIST(5.7.9+ 支持)
enforce_gtid_consistency 是硬性前提,不是可选项
enforce_gtid_consistency = ON 不是辅助开关,而是 gtid_mode = ON 能真正启用的先决条件。如果漏配,即使 gtid_mode 显示为 ON,实际复制仍无法初始化,日志里常出现误导性提示如:[Warning] Neither --relay-log nor --relay-log-index were used。
- 该参数必须在主、从两端都设为
ON,且同样写入[mysqld]段 - 开启后,部分语句会被拒绝,例如
CREATE TABLE ... SELECT、用户变量参与的非确定性 INSERT,需提前检查业务 SQL 兼容性 - 它和
gtid_mode是两个独立变量:一个管事务合规性,一个管 GTID 生效开关,缺一不可
从库残留状态会卡住 START SLAVE
从库如果之前用传统位置(MASTER_LOG_FILE/MASTER_LOG_POS)启动过复制,即使改了配置,gtid_executed 和 gtid_purged 可能仍为空或与主库不匹配,导致 START SLAVE 卡在 relay log 初始化阶段,报错类似:Slave failed to initialize relay log info structure。
- 检查从库当前 GTID 状态:
SELECT @@global.gtid_executed, @@global.gtid_purged; - 对比主库:
SHOW MASTER STATUS;中的Executed_Gtid_Set - 若从库
gtid_executed为空,说明没执行过 GTID 事务,不能直接START SLAVE,要先执行CHANGE MASTER TO MASTER_AUTO_POSITION = 1; - 若从库
gtid_purged包含主库没有的 UUID(比如曾手动PURGE BINARY LOGS),需在从库执行RESET MASTER;清空(确保无下游依赖)
初始化数据导入时 --set-gtid-purged 很关键
用 mysqldump 导出主库全量数据导入从库时,若忽略 GTID 上下文,会导致从库 gtid_executed 错乱,后续复制立即中断。
- 必须加
--set-gtid-purged=ON(默认值,但显式写出更安全) - 导出命令示例:
mysqldump -uroot -p --all-databases --single-transaction --set-gtid-purged=ON > dump.sql - 这个参数会让 dump 文件开头包含
SET @@GLOBAL.GTID_PURGED = 'xxx';和SET SQL_LOG_BIN = 0;,避免导入时生成新 GTID - 切勿用
--set-gtid-purged=OFF初始化 GTID 主从 —— 这会让从库的gtid_executed表被重置,重启后读取错误集合
最容易被忽略的是:配置文件里看着都写了,但某一行末尾多了一个空格、大小写拼错(比如 enforce-gtid-consistency 写成 enforce_gtid_consistency)、或者重启前忘了 systemctl daemon-reload,都会让整个 GTID 启动流程在 START SLAVE 那一刻彻底失败。











