萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

解決 MySQL "Too many connections" 錯誤:max_connections 與 wait_timeout 調優

錯誤現象

ERROR 1040 (HY000): Too many connections
Can not connect to MySQL server

當前連線數達到 max_connections 上限,新連線被拒。

核心參數

參數預設值建議值說明
max_connections151 (5.7) / 100 (舊版)500-3000最大同時連線數,含 1 個 SUPER 保留連線
wait_timeout28800 (8小時)10-60 秒非互動連線空閒超時秒數
interactive_timeout28800300-600互動式客戶端 (mysql CLI) 空閒超時
max_user_connections0 (無限制)按用戶限制單用戶最大連線數,防單一應用佔滿

修改配置

Linux (my.cnf)

# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
max_connections = 1000
wait_timeout = 30
interactive_timeout = 300
max_user_connections = 200  # 視應用數量設定

Windows (my.ini)

[mysqld]
max_connections = 1000
wait_timeout = 30

動態修改 (無需重啟,重啟後失效)

SET GLOBAL max_connections = 1000;
SET GLOBAL wait_timeout = 30;

永久生效必須寫入配置檔並重啟。

應用層優化 (治本)

  • 連線池:必須使用連線池 (HikariCP、Druid、DBCP),設定合理 maximumPoolSize
  • 及時釋放:try-with-resources / using / finally 確保關閉
  • 避免長連線:HTTP 請求結束即歸還連線,不要持有
  • 檢查洩漏:監控 Threads_connected 趨勢,配合 SHOW PROCESSLIST 找洩漏點

緊急臨時方案

-- 1. 管理員保留連線登入 (SUPER 權限)
mysql -u root -p -h localhost

-- 2. 臨時調大上限
SET GLOBAL max_connections = 2000;

-- 3. 殺掉閒置連線
SELECT CONCAT('KILL ', id, ';') FROM information_schema.PROCESSLIST
WHERE COMMAND = 'Sleep' AND TIME > 60;
-- 執行輸出的 KILL 語句

監控告警建議

-- 當前連線使用率
SELECT 
    VARIABLE_VALUE AS max_conn,
    (SELECT COUNT(*) FROM information_schema.PROCESSLIST) AS current_conn,
    ROUND((SELECT COUNT(*) FROM information_schema.PROCESSLIST) / VARIABLE_VALUE * 100, 2) AS usage_pct
FROM performance_schema.global_variables
WHERE VARIABLE_NAME = 'max_connections';

告警閾值建議:使用率 > 70% 預警,> 85% 緊急擴容或排查洩漏。

copyright © 萬盛學電腦網 all rights reserved