RESET SLAVE ALL清除从库复制状态而非业务数据:删除master.info和relay-log.info文件、所有relay log(含未应用的)、内存中主库连接参数及MASTER_DELAY,但不修改gtid_executed、gtid_purged或用户表数据。

不会直接丢失数据,但可能造成复制中断或后续同步错乱,本质是丢弃未应用的中继日志(relay log)和复制元数据,而非InnoDB表数据本身。
RESET SLAVE ALL 到底删了什么?
它清除的是复制状态,不是业务数据:
- 删除
master.info和relay-log.info文件 - 无条件删除所有
relay log文件(哪怕 SQL 线程还没来得及执行) - 清空内存中保存的主库连接参数:
MASTER_HOST、MASTER_PORT、MASTER_USER、MASTER_PASSWORD等 - 重置
MASTER_DELAY为 0 - 不修改
gtid_executed或gtid_purged,也不碰任何用户表数据
为什么有人觉得“数据丢了”?
常见误解来自两个典型场景:
- 执行前
SHOW SLAVE STATUS\G显示Relay_Log_Pos → 说明还有 relay log 没被 SQL 线程消费完;<code>RESET SLAVE ALL一删,这部分变更就永远消失了 - 执行后没立刻
CHANGE MASTER TO就START SLAVE→ 因为连接参数已清空,START SLAVE会报错或静默失败,误以为“同步停了、数据不更新了” - 误把
RESET SLAVE ALL当成RESET MASTER→ 后者真会清空 binlog 和 GTID 历史,影响主库,但前者只作用于从库自身状态
执行前必须核对的三个关键状态
跳过任一检查都可能导致意外丢变更:
-
Slave_IO_Running和Slave_SQL_Running必须都是No→ 先STOP SLAVE,否则命令直接报错ERROR 1197 (HY000) - 查
SELECT @@gtid_mode;→ 若为ON,后续CHANGE MASTER TO必须带MASTER_AUTO_POSITION = 1,不能填MASTER_LOG_FILE/MASTER_LOG_POS - 对比
Relay_Master_Log_File和Exec_Master_Log_File、Relay_Log_Pos和Exec_Master_Log_Pos→ 若不等,说明有 relay log 未执行,此时重置等于主动丢弃这部分更新
真正危险的操作其实是“之后没做对”
RESET SLAVE ALL 本身是干净的起点,但它的破坏性体现在后续衔接上:
- 忘记
CHANGE MASTER TO就START SLAVE→ 复制线程起不来,从库持续落后 - GTID 模式下仍用文件+位点方式配置 →
START SLAVE报错Cannot replicate from master without knowing the master's UUID - 误在主库上执行 → 命令虽不报错,但毫无意义(主库没有 slave 状态)
最常被忽略的一点:执行后 SHOW SLAVE STATUS\G 输出为空,这是正常现象——说明内存参数已清,不是故障。


















