MySQL 關閉非單純結束進程,而是經過拒絕新連線、優雅斷開現有連線、回滾活躍事務、刷新儲存引擎緩衝、持久化檢查點等多階段。理解此流程可避免強制 kill -9 導致資料損壞或漫長崩潰恢復。
mysqladmin shutdown 發送 SIGTERM,或客戶端發起建立專用關閉執行緒。KILLED,定期檢查並關閉。innodb_fast_shutdown=0/1 時刷髒頁至磁碟、記錄 LSN 至表空間、關閉內部執行緒;=2 直接關閉(下次啟動需崩潰恢復)。KILL CONNECTION:回滾事務、釋放資源、關閉連線(預設行為)。KILL QUERY:僅終止當前語句,保留連線與事務。SELECT 排序迴圈、ALTER TABLE 複製迴圈、UPDATE/DELETE 逐行後、GET_LOCK()、INSERT DELAYED、表鎖等待、磁碟空間等待。REPAIR/OPTIMIZE TABLE 執行中被 KILL 會導致表損壞,需再次修復。SET GLOBAL innodb_fast_shutdown = 1;(升降級版本時設 0)。SET GLOBAL innodb_max_dirty_pages_pct = 0; 強制刷髒頁。SET GLOBAL max_connections = 1; SET GLOBAL max_user_connections = 1; 僅保留當前連線。KILL 所有 Sleep > 1s 的閒置連線。SHOW PROCESSLIST 確認無大查詢、大交易、DDL 執行中。SHOW ENGINE INNODB STATUS 確認 History list length < 500、LSN 三值一致(Log sequence number = Log flushed up to = Last checkpoint at)。FLUSH LOCAL TABLES 刷新並關閉表(不寫 Binlog)。STOP SLAVE IO_THREAD 待 Relay Log 全應用後 STOP SLAVE SQL_THREAD。mysqladmin shutdown。緊急情況:SET GLOBAL innodb_fast_shutdown = 1; mysqladmin shutdown;極端情況kill -9需接受啟動時崩潰恢復時間成本(innodb_flush_log_at_trx_commit=0可能丟失 1 秒事務)。