必须显式指定--set-gtid-purged参数:主库备份用ON以写入GTID_PURGED语句确保从库同步,从库或独立实例备份用OFF避免GTID冲突;不加该参数会导致恢复时GTID状态不匹配而复制失败。

mysqldump 备份时必须加 --set-gtid-purged 参数
不加这个参数,备份文件里不会写入 SET @@GLOBAL.GTID_PURGED=... 语句,恢复时新实例无法对齐 GTID 状态,后续开启主从会报错 Cannot replicate because the master and slave have equal MySQL server ids 或更常见的 The slave is connecting using CHANGE MASTER TO ... which is not allowed when @@GLOBAL.GTID_MODE = ON。
实际使用中分两种场景:
- 主库备份:用
--set-gtid-purged=on(默认值),生成的 SQL 里会包含当前gtid_executed值,适合后续搭建从库 - 从库或独立实例备份:用
--set-gtid-purged=off,避免恢复时覆盖已有gtid_purged,否则可能丢事务或导致 GTID 冲突
典型命令:mysqldump -uroot -p -B --single-transaction --triggers --routines --events --set-gtid-purged=on mydb > backup.sql
恢复前必须确认 gtid_mode=ON 且 enforce_gtid_consistency=TRUE
如果目标实例没开 GTID,直接 source 备份文件会失败,报错类似 ERROR 1840 (HY000) at line 26: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty。
正确做法是:
- 先检查配置:
SELECT @@gtid_mode, @@enforce_gtid_consistency;,两个都必须为ON - 若未启用,需在
/etc/my.cnf中添加并重启:gtid-mode=ON和enforce-gtid-consistency=true - 重启后执行
RESET MASTER;清空gtid_executed(仅限全新实例,生产环境慎用)
注意:RESET MASTER 会清空所有 binlog 并重置 gtid_executed,只适用于空实例或重建从库场景。
恢复后要手动设置 gtid_purged 才能接续主从
source 完备份后,gtid_purged 不会自动生效——它只在备份文件里作为注释存在,MySQL 不会自动执行。必须显式设置:
SET @@GLOBAL.GTID_PURGED = 'a97983fc-5a29-11e6-9d28-000c29d4dc3f:1-15';
这个值来自备份文件开头的 SET @@GLOBAL.GTID_PURGED=... 行,不是当前实例的 gtid_executed。漏掉这步,CHANGE MASTER TO 会拒绝连接,报错 Master failed to send event correctly 或 Got fatal error 1236。
验证是否成功:SELECT @@gtid_purged; 应与你设的值一致;SELECT @@gtid_executed; 应为空或仅含本地临时事务(如建库语句)。
增量恢复依赖 mysqlbinlog --base64-output=decode-rows -v
GTID 环境下不能靠 position 恢复,必须用 GTID 范围定位。误删后想回滚,关键步骤是:
- 先查出误操作事务的 GTID:
mysqlbinlog --base64-output=decode-rows -v /var/lib/mysql/binlog.000002 | grep -A 10 -B 10 "DELETE FROM mydb.mytable" - 提取对应 GTID,比如
a97983fc-5a29-11e6-9d28-000c29d4dc3f:23 - 跳过该 GTID:
SET GLOBAL gtid_slave_skip_counter = 1;(仅用于传统复制)或更安全地用STOP SLAVE; SET GTID_NEXT = 'a97983fc-5a29-11e6-9d28-000c29d4dc3f:23'; BEGIN; COMMIT; SET GTID_NEXT = AUTOMATIC; START SLAVE;
注意:gtid_next 方式要求 slave 已处于 GTID 模式且 Auto_position=1,否则会报错 Cannot handle events with GTIDs while @@GLOBAL.GTID_MODE = OFF。
gtid_executed、恢复后的 gtid_purged、binlog 里的实际 GTID 集合,三者必须逻辑自洽。差一个事务号,复制就卡死。


















