MySQL 關機並非簡單的進程退出,而是經過精心設計的六階段流程,確保數據完整性、事務一致性、復制協調性。理解此流程有助於排查「關機卡住」、「數據丟失」、「從庫報錯」等疑難雜癥。
mysqladmin shutdown (需 SHUTDOWN 權限),跨平台通用。SIGTERM (如 kill -15 pid、systemd ExecStop)。Error: Can't create thread to kill server → 進程直接退出 (極端情況,數據風險極高)。Can't connect to MySQL server,不再進入連接處理邏輯。KILLED。
FLUSH TABLES 效果)。innodb_fast_shutdown 模式):
| 模式 | 行為 | 耗時 | 適用場景 |
|---|---|---|---|
| 0 (默認) | 完整刷新 Buffer Pool 到磁盤、合併 Change Buffer、寫入當前 LSN | 最長 (分鐘級) | 常規關機、備份前、版本升級 |
| 1 | 跳過 Buffer Pool 刷新、合併 Change Buffer,只寫 LSN | 快 (秒級) | 緊急重啟、已知數據安全 |
| 2 | 冷關機:不刷新、不合併、不寫 LSN,啟動時需 Crash Recovery | 最快 | 極端緊急、測試環境 |
生產環境常規關機必用 0,確保下次啟動無需恢復、啟動極快。
| 現象 | 可能階段卡住 | 排查方向 |
|---|---|---|
| shutdown 等待數分鐘無響應 | 階段 4 (長事務回滾) / 階段 5 (InnoDB 刷盤) | 查看 SHOW ENGINE INNODB STATUS、SHOW PROCESSLIST 找長事務;檢查 innodb_fast_shutdown 值 |
| 強制 kill -9 後啟動極慢 | 階段 5 被跳過 | 啟動時執行 Crash Recovery (紅日志應用),大庫可達數小時。禁用 kill -9 |
| 從庫關機後啟動復制報錯 | 階段 4 事務回滾導致 Relay Log 位點不連續 | 檢查 relay-log.info、master.info,用 CHANGE MASTER TO 修正位點 |
| MyISAM 表損壞 | 階段 4 非事務操作部分執行 | 關機前手動 FLUSH TABLES WITH READ LOCK,或避免關機時有大批量寫入 |
systemctl stop mysqld (Systemd 默認發 SIGTERM,等待 90s 後 SIGKILL),確保 innodb_fast_shutdown=0。SET GLOBAL innodb_fast_shutdown=1; systemctl restart mysqld (重啟後自動恢復 0)。innodb_fast_shutdown=0,獲得物理一致的文件副本。