ERROR 1040 (HY000): Too many connections
當前活躍連接數 (`Threads_connected`) 達到 `max_connections` 限制,新連接被拒絕。
| 參數 | 默認值 | 最大值 | 動態修改 |
|---|---|---|---|
| max_connections | 151 (5.7+) / 100 (舊版) | 100,000 (實際受 OS 文件句柄、內存限制) | ✅ `SET GLOBAL max_connections=2000` |
| max_user_connections | 0 (無限制) | 同 max_connections | ✅ 限制單用戶佔用 |
mysql> SET GLOBAL max_connections = 3000;
Query OK, 0 rows affected
mysql> SHOW VARIABLES LIKE 'max_connections';
**持久化:** 必須同步寫入 `/etc/my.cnf`:
[mysqld]
max_connections = 3000
# 配套調大
open_files_limit = 10000 -- OS ulimit -n 需同步調大
table_open_cache = 4000
thread_cache_size = 100 -- 緩存線程減少創建開銷
back_log = 200 -- TCP 監聽隊列
| 原因 | 現象 | 排查命令/代碼 |
|---|---|---|
| 應用連接池洩漏 | Threads_connected 持續增長不降 | 代碼審查 `close()`/`returnConnection()`;監控池 `NumActive`/`NumIdle` |
| 長事務/慢查詢堵塞 | 連接被長時間佔用 | `SHOW PROCESSLIST` 看 `Time` 大、`State=Sending data`/`Locked` |
| 連接池配置過大 | 多實例合計超過 max_connections | 總連接池上限 ≤ max_connections * 0.8 |
| 無連接池 (短連接風暴) | 高併發下頻繁創建銷毀 | 強制引入連接池 (HikariCP/Druid/Go sql.DB) |
| 睡眠連接堆積 | `Command=Sleep` 大量佔用 | `wait_timeout`/`interactive_timeout` 調小 (如 60s);應用層定期驗證 |
# 關鍵指標 (Prometheus mysqld_exporter)
mysql_global_status_threads_connected -- 當前連接數
mysql_global_variables_max_connections -- 限制值
mysql_global_status_threads_created -- 歷史創建線程總數 (持續增長正常)
mysql_global_status_aborted_connects -- 失敗連接數 (報警)
mysql_global_status_connection_errors_max_connections -- 因滿拒絕次數 (核心報警)
# Grafana 報警規則
Threads_connected / max_connections > 0.85 -- 警告
Threads_connected / max_connections > 0.95 -- 嚴重
connection_errors_max_connections > 0 -- 立即報警
# 超級用戶保留連接 (默認 1 個)
SET GLOBAL max_connections = 3000;
-- 或臨時放大
SET GLOBAL max_connections = 5000;
-- 同時殺掉閒置睡眠連接
KILL ; -- 批量腳本殺掉 Time > 60 的 Sleep 連接