MySQL 預設 max_connections=151 (8.0) 或 100 (舊版),高併發場景極易觸發 Too many connections 錯誤。本文提供查看當前連線、狀態監控、動態/永久調大上限、連線池配合等完整操作指南。
# 詳細進程列表 (含 SQL、執行時間、狀態)
mysqladmin -u root -p -h 10.140.1.1 processlist
# 摘要狀態 (Threads_connected = 當前連線數)
mysqladmin -u root -p -h 10.140.1.1 status
SHOW PROCESSLIST; -- 當前執行緒
SHOW FULL PROCESSLIST; -- 顯示完整 SQL 文本
SELECT * FROM information_schema.PROCESSLIST; -- 可用 WHERE 過濾
SHOW GLOBAL STATUS LIKE 'Threads_%';
/*
Threads_connected: 當前開啟連線數
Threads_running: 正在執行查詢的連線數
Threads_created: 歷史建立連線總數 (若快速增長說明連線池失效或頻繁重連)
Threads_cached: 執行緒緩存池中閒置執行緒數
*/
SET GLOBAL max_connections = 1000;
-- 或
SET PERSIST max_connections = 1000; -- 8.0+ 寫入 mysqld-auto.cnf 永久生效
[mysqld]
max_connections = 2000
# 相關建議同步調大
thread_cache_size = 100 # 緩存執行緒減少建立銷毀開銷
open_files_limit = 65535 # 系統檔案描述符上限
table_open_cache = 4000 # 表緩存
back_log = 200 -- 監聽隊列長度
系統層面同步調整 (Linux):/etc/security/limits.conf 加入 mysql soft nofile 65535 / mysql hard nofile 65535,/etc/sysctl.conf 加 net.core.somaxconn=65535,執行 sysctl -p。
| 原因 | 徵兆 | 解決 |
|---|---|---|
| 應用未使用連線池 | Threads_created 快速增長、大量 Sleep 連線 | 啟用 HikariCP/DBCP/連線池,設定合理 pool size |
| 連線未正確關閉 | 大量 Sleep 狀態連線、佔用連線數 | 程式碼使用 try-with-resources / using 區塊,檢查 finally 關閉 |
| 長時間交易/鎖等待 | Threads_running 高、查詢緩慢 | 優化 SQL、縮短交易範圍、設定 innodb_lock_wait_timeout |
| 慢查詢堆積 | 同樣 SQL 大量並發 | 開啟慢查詢日誌、加索引、讀寫分離 |
| 連線風暴 (突發流量) | 瞬間連線數飆升 | 應用層限流、ProxySQL 連線多工、MaxScale |
Threads_connected / max_connections > 80% 觸發告警。SHOW PROCESSLIST 找出長期 Sleep 或卡住查詢,配合 KILL id 清理。修改 sql/mysqld.cc 中 {"max_connections", ..., 100, ...} 的預設值 (第 3 欄位),重新 ./configure && make && make install。**不建議生產環境使用**,維護成本極高。