ERROR 3546的根本原因是GTID_EXECUTED与备份中GTID_PURGED重叠,MySQL为防事务重复或跳变而拒绝导入;最稳妥方案是删除备份文件中的SET GTID_PURGED语句,避免强行覆盖,确保GTID自然融入当前执行集。

导入备份时触发 ERROR 3546 (HY000) 的根本原因
不是备份文件“本身有问题”,而是 MySQL 在导入时发现 GTID_EXECUTED 和备份中声明的 GTID_PURGED 集合存在重叠 —— 它会直接拒绝执行,防止事务重复或跳变。这个检查发生在 source backup.sql 过程中,只要备份里有 SET @@GLOBAL.GTID_PURGED=... 行,且目标实例已执行过其中任意一个 GTID,就会报错。
为什么 RESET MASTER 能绕过但绝不能乱用
RESET MASTER 会清空 gtid_executed、gtid_purged 和所有 binlog 文件,让实例“从零开始”。此时再导入含 SET @@GLOBAL.GTID_PURGED= 的备份,就不会冲突。
- 仅适用于全新实例(无数据、无从库、无备份链路)
- 若该实例已是主库或参与 MGR/主从,执行后下游全部断连,复制关系永久断裂
- 临时恢复测试库前,务必先记录当前
SHOW GLOBAL VARIABLES LIKE 'gtid_executed';结果
真正安全的做法:删掉备份里的 SET GTID_PURGED 行
这不是“关闭 GTID”,而是避免备份强行覆盖当前 GTID 状态。GTID 模式本身仍开启,只是导入时不强求对齐历史。
- 验证方法:
head -20 backup.sql | grep -i gtid,应无输出 - 下次备份必须加
--set-gtid-purged=OFF;若用了--master-data=2,它默认启用 GTID 声明,需显式覆盖 - 注意:
--set-gtid-purged=OFF不等于禁用 GTID,实例仍是 GTID 模式
修复后必须检查 GTID 是否最终收敛
哪怕你删了 SET GTID_PURGED 行,导入后 Executed_Gtid_Set 也不代表和主库完全一致 —— GTID 同步靠的是后续 binlog 流持续追平,不是靠备份那一刻的快照。
- 恢复后立即执行:
SHOW SLAVE STATUS\G - 重点看
Executed_Gtid_Set是否在持续增长、是否最终与主库对齐 - 最容易被忽略的一点:如果备份过程中主库有并发写入,从库导入完成后的 GTID 集合天然就比主库少,必须等 SQL 线程追上才真正一致


















