首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 關閉流程深度解析與安全關閉最佳實務:從 SIGTERM 到 InnoDB 刷髒頁的完整鏈路

     編輯:MySQL 資料庫相關知識

MySQL 關閉非單純結束進程,而是經過拒絕新連線、優雅斷開現有連線、回滾活躍事務、刷新儲存引擎緩衝、持久化檢查點等多階段。理解此流程可避免強制 kill -9 導致資料損壞或漫長崩潰恢復。

關閉六階段

  1. 發起關閉:mysqladmin shutdown 發送 SIGTERM,或客戶端發起建立專用關閉執行緒。
  2. 停止接受新連線:關閉 TCP/IP、Unix Socket 監聽。
  3. 逐步關閉現有連線:
    • 閒置連線立即終止。
    • 活躍連線標記 KILLED,定期檢查並關閉。
    • 活躍事務回滾(非事務表已修改資料無法回滾)。
    • 主從複制場景:Master 同樣處理;Slave 依序關閉 IO/SQL 執行緒,SQL 執行緒 5.0.81+ 等待當前事務完成再關閉。
  4. 關閉儲存引擎:
    • 刷新 Table Cache、關閉所有開啟表。
    • MyISAM:刷新待寫入操作。
    • InnoDB:innodb_fast_shutdown=0/1 時刷髒頁至磁碟、記錄 LSN 至表空間、關閉內部執行緒;=2 直接關閉(下次啟動需崩潰恢復)。
  5. 進程退出。

KILL 指令細節(5.0+)

  • KILL CONNECTION:回滾事務、釋放資源、關閉連線(預設行為)。
  • KILL QUERY:僅終止當前語句,保留連線與事務。
  • 殺死標記僅在特定檢查點生效:SELECT 排序迴圈、ALTER TABLE 複製迴圈、UPDATE/DELETE 逐行後、GET_LOCK()、INSERT DELAYED、表鎖等待、磁碟空間等待。
  • REPAIR/OPTIMIZE TABLE 執行中被 KILL 會導致表損壞,需再次修復。

安全關閉 10 步驟標準作業程序(SOP)

  1. 以最高權限帳號透過 Unix Socket 連線。
  2. SET GLOBAL innodb_fast_shutdown = 1;(升降級版本時設 0)。
  3. SET GLOBAL innodb_max_dirty_pages_pct = 0; 強制刷髒頁。
  4. SET GLOBAL max_connections = 1; SET GLOBAL max_user_connections = 1; 僅保留當前連線。
  5. KILL 所有 Sleep > 1s 的閒置連線。
  6. SHOW PROCESSLIST 確認無大查詢、大交易、DDL 執行中。
  7. SHOW ENGINE INNODB STATUS 確認 History list length < 500、LSN 三值一致(Log sequence number = Log flushed up to = Last checkpoint at)。
  8. FLUSH LOCAL TABLES 刷新並關閉表(不寫 Binlog)。
  9. Slave 先 STOP SLAVE IO_THREAD 待 Relay Log 全應用後 STOP SLAVE SQL_THREAD。
  10. 執行 mysqladmin shutdown。
緊急情況:SET GLOBAL innodb_fast_shutdown = 1; mysqladmin shutdown;極端情況 kill -9 需接受啟動時崩潰恢復時間成本(innodb_flush_log_at_trx_commit=0 可能丟失 1 秒事務)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved