Windows 環境下 MySQL 服務莫名自動停止,事件查看器記錄「服務意外終止」,無明顯錯誤日志。
服務首次失敗時,Windows 默認**不重啟**,導致 MySQL 掛掉後無人拉起。
Win+R → services.msc 打開服務管理器。MySQL(或自定義服務名),右鍵「屬性」→「恢復」標籤。驗證:任務管理器強制結束 mysqld.exe 進程,觀察服務是否自動重啟(幾秒內 PID 變化)。
注意:此設置會導致無法通過「服務管理器」正常停止 MySQL(停止命令會被視為失敗並觸發重啟)。需停止時,先將恢復策略改回「不操作」,停完再改回。
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] 區塊同樣添加上行。
重啟服務生效。
[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 物理熱備,**無需停庫**。
error.log 最後 200 行,搜索 FATAL、ERROR、Aborted。SHOW GLOBAL STATUS LIKE 'Threads_connected'; 對比 max_connections。netstat -an | findstr 3306)。MySQL 服務自動停止,90% 歸因於 **Windows 服務恢復策略缺失** 或 **連接數/內存配置不當** 導致資源耗盡崩潰。配置「失敗即重啟」、按業務峰值預留 30% 連接數餘量、同步調大線程級緩存參數、啟用錯誤日誌並接入監控告警,可消除絕大多數自動停止故障。若問題持續,**錯誤日誌是唯一真理來源**,請務必讀懂它。