MySQL服務器關閉六大階段
理解關機流程有助於排查關機卡頓、資料一致性風險、復制中斷等問題。完整關閉流程包含六個階段:
- 啟動關閉程序
- 建立關閉執行緒
- 停止接受新連線
- 終止當前活動連線
- 關閉儲存引擎
- 服務器進程退出
階段一:啟動關閉程序
多種觸發方式:
- 管理命令:
mysqladmin shutdown(需SHUTDOWN權限,跨平台通用)
- Unix信號:接收
SIGTERM訊號(kill pid預設發送)
- Windows服務:服務管理器發送停止命令(
net stop mysql)
階段二:建立關閉執行緒
- 客戶端發起關閉 → 建立專用關閉執行緒處理
SIGTERM信號 → 信號處理執行緒自行處理或建立獨立執行緒
- 記憶體不足無法建立執行緒 → 錯誤日誌記錄
Error: Can't create thread to kill server,服務器嘗試直接退出
階段三:停止接受新連線
關閉所有監聽端點,防止新活動啟動:
- TCP/IP埠(預設3306)
- Unix Socket檔案
- Windows命名管道
- Windows共享記憶體
階段四:終止當前活動連線
一般客戶端連線
- 斷開連線,標記執行緒為「Killed」
- 閒置連線:立即終止
- 執行查詢中:定期檢查狀態,較慢終止
- MyISAM表
REPAIR/OPTIMIZE操作:可被KILL中斷
交易處理
- 開啟交易的連線:自動回滾(Rollback)
- 非交易表(MyISAM):多行
UPDATE/INSERT可能部分完成導致資料不一致
復制相關執行緒
- 主庫:從庫連線執行緒視同一般客戶端,標記Killed退出
- 從庫:
- 優先停止I/O與SQL執行緒
- SQL執行緒允許完成當前語句(避免復制不一致)再停止
- 若處於交易中段 → 交易回滾
階段五:關閉儲存引擎
- 清空表快取,關閉所有開啟表
- MyISAM:刷新掛起的索引寫入操作
- InnoDB:
- 將緩衝池刷新至磁碟(除非
innodb_fast_shutdown=2)
- 寫入當前LSN(Log Sequence Number)
- 終止內部背景執行緒(Master thread、IO thread等)
關鍵配置參數:innodb_fast_shutdown
| 值 | 行為 | 適用場景 |
| 0(慢速關機) | 完整刷新緩衝池、合併Change Buffer、完整清理 | 生產環境標準關機、版本升級前 |
| 1(預設,快速關機) | 跳過Change Buffer合併、跳過完整清理 | 日常重啟、平衡速度與安全 |
| 2(冷關機) | 僅刷新日誌、不刷新資料頁,啟動時需執行Crash Recovery | 緊急關機、極度趕時間(風險較高) |
運維建議
- 生產環境重啟前執行
FLUSH TABLES WITH READ LOCK確保一致性
- 監控錯誤日誌確認
Shutdown complete訊息
- 避免使用
kill -9強制終止(導致InnoDB需執行較長Crash Recovery)
- 大型資料庫關機可能耗時數分鐘至數小時,請規劃維護窗口