ERROR 1040: Too many connections 是 MySQL 運維中最常見的報警之一。本文從連接洩漏代碼根因、配置參數調整、架構層面連接池治理、監控預警體系四個維度,給出完整解決方案與預防指南。
Can not connect to MySQL Server
Error: Too many connections
Errno: 1040
默認 max_connections = 151(5.7+),達到上限後新連線被拒。
// 錯誤:異常拋出時未關閉連接
Connection conn = null;
try {
conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate(sql); // 可能拋出異常
// 正常路徑才會執行 close()
conn.close();
} catch (SQLException e) {
log.error(e);
// 忘記 conn.close()!連接洩漏
}
// 自動關閉,即使拋出異常
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql);
}
// 編譯器自動生成 finally { close(); }
with conn.cursor() as cur: 或 conn.close() 在 finallydefer db.Close() 或 defer rows.Close()mysqli_close($link) 在腳本結束或 register_shutdown_functionpool.end() 优雅關閉| 參數 | 問題 | 建議 |
|---|---|---|
| 最大連接數過大 | 超過 MySQL max_connections |
連接池上限 ≤ MySQL max_connections * 0.8(預留管理連接) |
| 最小閒置連接過多 | 佔用資源、觸發 MySQL 空閒斷開 | 最小 = 核心業務並發基線,通常 10-20 |
| 連接獲取超時過長 | 業務堵塞、級聯故障 | 獲取超時 1-3s,查詢超時 5-10s |
| 空閒回收時間過長 | MySQL 端主動斷開(wait_timeout=8h),池中殘留失效連接 | testOnBorrow=true + validationQuery=SELECT 1,或 minEvictableIdleTimeMillis < wait_timeout |
解決:拆分大事務、優化慢 SQL、異步處理非即時業務。
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
max_connections = 1000
# 同步調大相關緩衝區
thread_cache_size = 100
open_files_limit = 65535
重啟生效:systemctl restart mysqld
SET GLOBAL max_connections = 1000;
# /usr/local/mysql/bin/mysqld_safe
# 找到 max_connections 參數行修改
# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
# /etc/sysctl.conf
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# sysctl -p 生效
Threads_connected / max_connections > 70% 告警Connection_errors_max_connections > 0 立即告警active, idle, waiting, usage%
-- 當前連接分布
SELECT
USER, HOST, DB, COMMAND, TIME, STATE, INFO,
COUNT(*) AS conn_count
FROM information_schema.PROCESSLIST
GROUP BY USER, HOST, DB, COMMAND
ORDER BY conn_count DESC;
-- 找出睡眠連接(疑似洩漏)
SELECT * FROM information_schema.PROCESSLIST
WHERE COMMAND = 'Sleep' AND TIME > 60
ORDER BY TIME DESC;
Too many connections 看似配置問題,實則多為代碼質量與架構治理問題。從「調大 max_connections」走向「修復洩漏、優化池、讀寫分離、中間件熔斷」,是運維成熟度的體現。