必须用 reset slave all 而非 reset slave,因为 mysql 8.0 默认按通道管理复制状态,reset slave 仅清空默认通道,而 reset slave all 才能彻底清除所有通道的 io/sql 线程、gtid 位置、relay log 文件及 master/relay log info 元数据。

MySQL 8.0 必须用 RESET SLAVE ALL 而不是 RESET SLAVE
因为 MySQL 8.0 默认按通道(channel)管理复制状态,即使你只配了一个主库,内部也视为默认通道 ''。而 RESET SLAVE 只清空这个默认通道,其他隐式或显式注册的通道(比如 channel_1)完全不受影响。
常见错误现象包括:
-
SHOW SLAVE STATUS\G仍显示旧的Master_Host或Relay_Log_File - 执行
CHANGE MASTER TO报错ERROR 3077 (HY000): Cannot change the 'MASTER_BIND' option when a channel is running - 启用了 GTID 但
Executed_Gtid_Set没清空,导致MASTER_AUTO_POSITION=1失败
这些基本都是漏掉 ALL 导致的残留状态干扰。
RESET SLAVE ALL 实际清除哪些东西?
它不是“重启服务”那种模糊操作,而是明确删除以下几类运行时元数据:
- 停止所有 IO/SQL 线程(不管几个通道)
- 清空
mysql.slave_master_info和mysql.slave_relay_log_info表全部记录 - 移除 relay log 文件(
relay-log配置路径下的.000001等) - 重置
Seconds_Behind_Master、Read_Master_Log_Pos等字段为NULL - 若
gtid_mode=ON且未显式设置gtid_purged,则清空gtid_executed和gtid_purged
注意:RESET SLAVE ALL 不动 my.cnf,也不删任何业务表或数据,只清理内存+磁盘上的复制中间状态。
执行前必须先 STOP SLAVE
这是硬性前提。如果复制线程还在跑,RESET SLAVE ALL 会失败或行为不可控。
正确顺序只有这一种:
STOP SLAVE;RESET SLAVE ALL;
别跳过 STOP SLAVE 直接执行 RESET SLAVE ALL —— 在某些版本(如 5.7)上可能看似成功,但后续 START SLAVE 会卡住或报错。
重置后 SHOW SLAVE STATUS 没输出?正常
执行完 RESET SLAVE ALL 后,SHOW SLAVE STATUS\G 返回空结果,不是 bug,是预期行为:所有通道都被注销了,没有可展示的状态。
这时候要重新配置复制,例如:
- 用
CHANGE MASTER TO ... FOR CHANNEL '';配默认通道 - 或用
CHANGE MASTER TO ... FOR CHANNEL 'channel_x';配多源 - 再
START SLAVE;或START SLAVE FOR CHANNEL 'channel_x';
最容易被忽略的是:重置之后不能直接 START SLAVE,必须先 CHANGE MASTER TO,否则线程起不来——因为连接参数全被清空了。











