報錯 ERROR 1040 (HY000): Too many connections,意味著當前連接數達到 max_connections 上限(默認 151,舊版 100)。
-- 運行時動態調整(無需重啟,MySQL 5.7+)
SET GLOBAL max_connections = 1000;
-- 永久生效
# /etc/my.cnf
[mysqld]
max_connections = 2000
重啟後生效。Linux 內核參數 fs.file-max、net.core.somaxconn、ulimit -n 同步調大。
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| 連接數緩慢上升不降 | 應用連接池洩漏(未 close/return) | SHOW PROCESSLIST; 觀察 Sleep 狀態堆積 |
| 突發尖峰 | 定時任務/批量導入並發過高 | SHOW GLOBAL STATUS LIKE 'Max_used_connections'; |
| 長事務阻塞 | 事務未提交持有連接 | SELECT * FROM information_schema.INNODB_TRX; |
| 連接池配置過大 | 多實例共享物理機,總和超限 | 檢查 HikariCP/Druid maximumPoolSize |
maximumPoolSize = (CPU核心數 * 2) + 有效磁盤數,配合 idleTimeout=30000、maxLifetime=1800000。try-with-resources / finally { close(); } 確保歸還;Spring @Transactional 避免長事務。Threads_connected / max_connections > 80% 觸發告警。MySQL 保留 1 個 SUPER 連接槽(max_connections+1),管理員可在連接滿時登入 SHOW PROCESSLIST 搶救現場。
[mysqld]
max_connections = 2000
open_files_limit = 65535
table_open_cache = 4000
thread_cache_size = 100
back_log = 200