在 MySQL 主從複制運維中,RESET SLAVE 與 RESET MASTER 是兩個極易混淆但用途截然不同的指令。錯誤使用可能導致複制中斷、資料不一致甚至主庫 Binlog 遺失。本文詳細對比兩者差異、參數細節、GTID 環境行為與操作禁忌。
| 指令 | 作用對象 | 核心動作 | 典型場景 |
|---|---|---|---|
| RESET SLAVE | 從庫 | 清除複制位點、刪除 Relay Log、重置複制狀態 | 從庫重新同步、拓撲變更、測試環境重置 |
| RESET MASTER | 主庫 | 刪除所有 Binlog、重置 Binlog 索引、生成新 Binlog | 主庫初始化搭建、測試環境清理、Binlog 損壞重建 |
RESET SLAVE [ALL] [FOR CHANNEL channel] -- 5.7.6+ 多源複制支援 channel_option
master.info、relay-log.info 檔案MASTER_DELAY 重置為 0效果:執行後可直接 START SLAVE,從庫將從主庫 Binlog 開頭重新複制 (即使 Relay Log 尚有未應用事件)。
STOP SLAVE;
RESET SLAVE;
START SLAVE; -- 直接生效,無需 CHANGE MASTER TO
STOP SLAVE;
RESET SLAVE ALL;
START SLAVE; -- ERROR 1200: The server is not configured as slave; fix with CHANGE MASTER TO
需重新執行 CHANGE MASTER TO 才能啟動複制。
RESET SLAVE / RESET SLAVE ALL 引發隱式提交 (進行中事務自動提交)RESET SLAVE ALL 不清除 IGNORE_SERVER_IDS 列表的 Bug (Bug #18816897)mysql-bin.000001)gtid_purged、gtid_executed (全域值,Session 值保留)mysql.gtid_executed 表內容 (從庫可不開啟 Binlog 仍能追蹤 GTID)| 差異點 | RESET MASTER | PURGE BINARY LOGS |
|---|---|---|
| 刪除範圍 | 所有 Binlog | 指定時間點/檔案前 |
| Binlog 編號 | 重置為 000001 | 保持原有編號序列 |
| 主從環境安全性 | 極度危險:從庫會找不到舊 Binlog 報錯 | 相對安全:前提是被刪 Binlog 已同步至從庫 |
-- PURGE 範例
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
STOP SLAVE → RESET SLAVE ALL → CHANGE MASTER TO → START SLAVERESET MASTER → 建立從庫PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY) 並確認從庫同步位點RESET MASTER 會同步清理 GTID 狀態,適合全新拓撲部署RESET SLAVE 是從庫複制狀態的「軟重置」,保留連線參數便於快速重啟;RESET SLAVE ALL 是「硬重置」,需重新配置連線。RESET MASTER 是主庫 Binlog 的「核彈級重置」,嚴禁在有從庫運行時使用。生產環境清理 Binlog 必須使用 PURGE BINARY LOGS 並驗證從庫同步進度。GTID 環境下兩指令均會同步重置 GTID 狀態,簡化了拓撲重構流程。