MySQL 預設 max_connections = 151 (5.6+ 為 151,舊版 100)。實際可用連線數 = max_connections + 1 (保留給 SUPER 權限帳號)。高併發 Web 應用常因連線池設定不當、長查詢阻塞、未正確關閉連線而耗盡連線數,出現 ERROR 1040 (HY000): Too many connections。
[mysqld]
max_connections = 1000
# 相關配套參數 (建議同步調整)
open_files_limit = 65535 -- 作業系統開啟檔案數限制,需 ulimit -n 配合
table_open_cache = 4000 -- 表快取,約 max_connections x 4
thread_cache_size = 100 -- 執行緒快取,減少建立/銷毀開銷
back_log = 200 -- 連線佇列長度,突發連線緩衝
重啟生效:
systemctl restart mysqld
# 或
service mysql restart
-- 登入 MySQL
mysql -u root -p
-- 設定全域變數 (需 SUPER 權限)
SET GLOBAL max_connections = 1000;
-- 驗證
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Max_used_connections'; -- 歷史峰值使用數
適用於從源碼編譯 MySQL 的場景 (極少見):
sql/mysqld.cc (或舊版 sql/mysqld.cc){"max_connections", OPT_MAX_CONNECTIONS,./configure && make && make install同樣需配置檔覆蓋,此法僅改變「未提供配置檔時的預設值」。
若透過 systemd 管理 MySQL,LimitNOFILE 可能限制實際最大連線數:
# 編輯 systemd 服務單元
systemctl edit mysqld
# 加入以下內容
[Service]
LimitNOFILE=65535
LimitNPROC=65535
# 重載並重啟
systemctl daemon-reload
systemctl restart mysqld
-- 目前連線數
SHOW STATUS LIKE 'Threads_connected';
-- 歷史峰值
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
-- 使用率計算
SELECT
VARIABLE_VALUE AS max_conn,
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_connected') AS current_conn,
ROUND((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_connected') / VARIABLE_VALUE * 100, 2) AS usage_pct
FROM performance_schema.global_variables
WHERE VARIABLE_NAME = 'max_connections';
# 使用率超過 80% 持續 5 分鐘告警
- alert: MySQLConnectionsHigh
expr: (mysql_global_status_threads_connected / mysql_global_variables_max_connections) > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "MySQL 連線使用率過高 ({{ $value | humanizePercentage }})"
| 連線池參數 | 建議值 | 原則 |
|---|---|---|
| 最大連線數 | min(DB max_connections * 0.8, CPU核心數 * 4) | 留 20% 給管理連線、備份、監控 |
| 最小閒置 | 最大連線數 * 0.2 | 避免冷啟動延遲 |
| 取得連線逾時 | 3-5 秒 | 快速失敗,避免請求堆積 |
| 閒置回收時間 | 5-10 分鐘 | 平衡資源佔用與重用效率 |
| 連線驗證 | validationQuery="SELECT 1", testOnBorrow=true | 防止 Stale connection |
max_connections × (sort_buffer_size + join_buffer_size + ...) 總記憶體佔用。ulimit -n、systemd LimitNOFILE、TCP 連線追蹤表大小 (net.netfilter.nf_conntrack_max) 皆可能成為瓶頸。Max_used_connections 峰值max_connections × per_thread_buffers < 可用記憶體 70%科學調整 max_connections,配合應用端連線池優化與持續監控,才能從根本上解決「Too many connections」問題,保障資料庫服務穩定性。