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

MySQL 服務器關閉流程全解析:六階段優雅停機機制

     編輯:MySQL 資料庫相關知識

關閉流程總覽

  1. 啟動關閉進程
  2. 創建關閉線程
  3. 停止接收新連接
  4. 終止當前活動
  5. 關閉存儲引擎
  6. 服務器退出

詳細階段解析

階段 1:啟動關閉進程

多種觸發方式:

  • mysqladmin shutdown(需 SHUTDOWN 權限,跨平台)
  • Unix 信號:SIGTERM(kill -TERM pid)
  • Windows 服務管理器:net stop mysql 或服務面板停止
  • 系統關機:systemctl stop mysqld

階段 2:創建關閉線程

  • 客戶端發起 → 服務器創建專用關閉線程處理。
  • 信號觸發 → 信號處理線程可直接執行或創建獨立線程。
  • 創建失敗(如內存耗盡) → 錯誤日志記錄 Error: Can't create thread to kill server,服務器嘗試直接退出。

階段 3:停止接收新連接

關閉所有監聽端點:

  • TCP/IP 端口(默認 3306)
  • Unix Socket 文件(/tmp/mysql.sock)
  • Windows 命名管道
  • Windows 共享內存

新連接嘗試將立即報錯「Can't connect to MySQL server」。

階段 4:終止當前活動

線程類型處理方式
客戶端連接線程 斷開連接,標記 KILLED。空閒線程立即退出;執行查詢線程定期檢查標記,較慢退出
事務線程 自動回滾未提交事務
非事務表更新 部分更新風險:多行 UPDATE/INSERT 可能僅執行部分後被中斷
主庫復制線程 視同普通客戶端線程,標記殺掉退出
從庫 I/O 線程 立即停止
從庫 SQL 線程 允許完成當前語句(避免復制不一致),若在事務中則回滾

階段 5:關閉存儲引擎

  • 清空表緩存,關閉所有打開的表。
  • MyISAM:刷新掛起的索引寫操作。
  • InnoDB:
    • innodb_fast_shutdown=0(默認):完整刷新緩衝池到磁碟、合併 Change Buffer、寫入當前 LSN → 重啟最快,關閉最慢。
    • innodb_fast_shutdown=1:跳過 Change Buffer 合併、刷新緩衝池 → 平衡。
    • innodb_fast_shutdown=2:僅刷新日志、不刷數據頁 → 關閉最快,重啟需恢復(生產慎用)。

階段 6:服務器退出

進程正常退出,返回碼 0。異常退出會在錯誤日志留下堆棧信息。

運維最佳實踐

  1. 永不使用 kill -9:導致 InnoDB 恢復時間不可控,數據一致性風險。
  2. 關閉前執行 FLUSH TABLES WITH READ LOCK 確保靜態一致性(備份場景)。
  3. 大內存實例(>64GB)關閉可能耗時數分鐘,納入運維預期與 SLA。
  4. 監控 Innodb_buffer_pool_pages_dirty 變化,預估刷盤時間。
  5. 配置 innodb_max_dirty_pages_pct 降低髒頁比例,加速關閉。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved