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

MySQL 服務自動停止問題排查:Windows 恢復策略與最大連接數調優

     編輯:MySQL 綜合教學

現象

Windows 環境下 MySQL 服務莫名自動停止,事件查看器記錄「服務意外終止」,無明顯錯誤日志。

原因一:Windows 服務恢復策略默認「不操作」

服務首次失敗時,Windows 默認**不重啟**,導致 MySQL 掛掉後無人拉起。

修正步驟

  1. Win+R → services.msc 打開服務管理器。
  2. 找到 MySQL(或自定義服務名),右鍵「屬性」→「恢復」標籤。
  3. 「首次失敗」→ 選擇 **「重新啟動服務」**。
  4. 「重新啟動服務」延遲 → 設為 **0 分鐘**(立即重啟)。
  5. 「第二次失敗」「後續失敗」同理設為「重新啟動服務」。
  6. 點擊「確定」生效。

驗證:任務管理器強制結束 mysqld.exe 進程,觀察服務是否自動重啟(幾秒內 PID 變化)。

注意:此設置會導致無法通過「服務管理器」正常停止 MySQL(停止命令會被視為失敗並觸發重啟)。需停止時,先將恢復策略改回「不操作」,停完再改回。

原因二:最大連接數耗盡導致拒絕新連接、甚至 OOM 崩潰

現象

  • 應用報錯 Too many connections。
  • 錯誤日誌出現 Out of memory 或 Can't create thread。

臨時調整(運行時生效,重啟失效)

mysql -uroot -p -e "SET GLOBAL max_connections=1000;"

查看當前值:

mysql -uroot -p -e "SHOW VARIABLES LIKE 'max_connections';"
# 或
mysqladmin -uroot -p variables | findstr max_con

永久調整(需重啟)

Windows:編輯 my.ini(安裝目錄或 C:\Windows\my.ini),[mysqld] 區塊:

max_connections=1000

Linux:編輯 /etc/my.cnf,[mysqld] 區塊同樣添加上行。

重啟服務生效。

配套內存參數同步調大(防 OOM)

[mysqld]
max_connections=1000
thread_cache_size=100          # 緩存線程,減少頻繁創建銷毀
table_open_cache=4000          # 表緩存,配合 max_connections
open_files_limit=65535         # 系統文件句柄上限,需 ulimit -n 配合
sort_buffer_size=2M            # 每線程排序緩存,總量 = max_connections * sort_buffer_size
join_buffer_size=2M            # 每線程 JOIN 緩存
read_buffer_size=2M
read_rnd_buffer_size=8M

估算內存上限:
全局內存(innodb_buffer_pool_size + key_buffer_size 等)+ max_connections * (sort_buffer + join_buffer + read_buffer + read_rnd_buffer + thread_stack) ≤ 物理內存 80%。

原因三:錯誤日誌關鍵信息被忽略

啟用錯誤日誌並定期查看:

[mysqld]
log-error=/var/log/mysql/error.log    # Linux
log-error="D:/mysql/data/error.log"   # Windows

常見致命錯誤:

  • InnoDB: Cannot allocate memory for the buffer pool → innodb_buffer_pool_size 過大或內存不足。
  • Disk is full writing → 磁盤滿,清理 Binlog/臨時文件/舊備份。
  • Can't create test file → datadir 權限錯誤或路徑不存在。

原因四:定時備份腳本誤關閉服務

部分舊版備份腳本使用 net stop mysql 停庫備份,異常退出時未 net start mysql。
**修正**:改用 mysqldump --single-transaction 熱備,或 xtrabackup 物理熱備,**無需停庫**。

綜合排查清單

  1. 檢查 Windows 服務恢復策略是否為「重新啟動服務」。
  2. 查看錯誤日誌 error.log 最後 200 行,搜索 FATAL、ERROR、Aborted。
  3. 執行 SHOW GLOBAL STATUS LIKE 'Threads_connected'; 對比 max_connections。
  4. 監控系統資源:CPU、內存、磁盤 I/O、網絡連接數(netstat -an | findstr 3306)。
  5. 排查定時任務(Windows 任務計劃程序 / Linux crontab)是否有停庫操作。

結語

MySQL 服務自動停止,90% 歸因於 **Windows 服務恢復策略缺失** 或 **連接數/內存配置不當** 導致資源耗盡崩潰。配置「失敗即重啟」、按業務峰值預留 30% 連接數餘量、同步調大線程級緩存參數、啟用錯誤日誌並接入監控告警,可消除絕大多數自動停止故障。若問題持續,**錯誤日誌是唯一真理來源**,請務必讀懂它。

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