首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 安全關閉實例完整流程:從優雅關閉到緊急殺進程的最佳實踐

     編輯:MySQL 綜合教學

MySQL 安全關閉實例:標準流程、關鍵參數與緊急方案

正確關閉 MySQL 能保證數據零丟失、減少啟動恢復時間。本文詳細拆解 mysqld 關閉階段,給出生產環境標準操作步驟(SOP)與緊急降級方案。

一、MySQL 關閉內部流程

  1. 接收 SIGTERM 或客戶端 SHUTDOWN 命令。
  2. 創建專用 shutdown 線程(內存不足時會報錯 Can't create thread to kill server)。
  3. 關閉監聽端口(TCP/IP、Unix Socket),拒絕新連接。
  4. 逐步關閉現有連接:空閒連接立即斷開;活躍事務標記 KILLED,等待回滾(非事務表修改不可回滾)。
  5. 從庫關閉 IO/SQL 線程,SQL 線程 5.0.81+ 等待當前事務完成。
  6. 刷新表緩存,關閉所有打開的表。
  7. 存儲引擎關閉:MyISAM 刷新鍵緩存;InnoDB 刷新 Buffer Pool 髒頁、寫入 LSN 检查點、關閉後台線程(受 innodb_fast_shutdown 控制)。
  8. 進程退出。

二、KILL 命令行為差異

  • KILL CONNECTION:回滾事務,釋放資源,斷開連接。
  • KILL QUERY:僅終止當前語句,保持連接與事務。
  • 殺死標記僅在特定點檢查(讀取行塊、ALTER TABLE 拷貝、UPDATE/DELETE 行鎖、GET_LOCK、INSERT DELAY、等待鎖/磁盤空間),非即時生效。

三、生產環境安全關閉 SOP(推薦)

  1. 使用高權限賬號,Unix Socket 連接:mysql -u root -p -S /tmp/mysql.sock。
  2. SET GLOBAL innodb_fast_shutdown = 1;(快速關閉,不做 full purge/merge)。升級/降級版本時設為 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 且 Time > 1 的閒置線程。
  6. SHOW PROCESSLIST 確認無長事務、大查詢、DDL、大範圍 UPDATE。
  7. SHOW ENGINE INNODB STATUS 確認 History list length < 500,且 Log sequence number = Log flushed up to = Last checkpoint at(LSN 已刷盤)。
  8. FLUSH LOCAL TABLES(刷新表緩存,不寫 binlog)。
  9. 從庫:先 STOP SLAVE IO_THREAD,待 Relay Log 全應用後 STOP SLAVE SQL_THREAD。
  10. 執行 mysqladmin shutdown。

四、緊急方案(可接受風險時)

  • SET GLOBAL innodb_fast_shutdown = 1; mysqladmin shutdown(跳過髒頁刷盤,啟動時做 Crash Recovery)。
  • OS 層 kill -TERM (等同 mysqladmin shutdown)。
  • kill -9 (強制殺進程,innodb_flush_log_at_trx_commit=0 時可能丟失最近事務),啟動觸發 Crash Recovery,耗時較長。

五、總結

常規場景 mysqladmin shutdown 足夠;遇阻塞按 SOP 排查;極端情況用 innodb_fast_shutdown=1 + kill -TERM,權衡恢復時間與數據安全。建議將 SOP 固化為運維手冊,定期演練。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved