首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL max_connections 調大完整指南:三種方法、持久化與監控最佳實踐

     編輯:MySQL 資料庫相關知識

為什麼預設 100 連線不夠用?

MySQL 預設 max_connections = 151 (5.6+ 為 151,舊版 100)。實際可用連線數 = max_connections + 1 (保留給 SUPER 權限帳號)。高併發 Web 應用常因連線池設定不當、長查詢阻塞、未正確關閉連線而耗盡連線數,出現 ERROR 1040 (HY000): Too many connections。

方法一:修改配置檔永久生效 (推薦生產環境)

Linux: /etc/my.cnf 或 /etc/mysql/my.cnf

Windows: 安裝目錄 my.ini

[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 的場景 (極少見):

  1. 編輯 sql/mysqld.cc (或舊版 sql/mysqld.cc)
  2. 尋找 {"max_connections", OPT_MAX_CONNECTIONS,
  3. 修改預設值 (第 10 個參數) 從 151 改為 1500
  4. 重新 ./configure && make && make install

同樣需配置檔覆蓋,此法僅改變「未提供配置檔時的預設值」。

Systemd 環境下的額外限制 (CentOS 7+/RHEL 7+/Ubuntu 16.04+)

若透過 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';

Grafana/Prometheus 告警規則範例

# 使用率超過 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

常見誤區與避坑指南

  1. 盲目調大 max_connections:每個連線消耗記憶體 (sort_buffer、join_buffer、read_buffer 等),1000 連線可能需額外 1-2GB RAM。需評估 max_connections × (sort_buffer_size + join_buffer_size + ...) 總記憶體佔用。
  2. 忽略作業系統限制:ulimit -n、systemd LimitNOFILE、TCP 連線追蹤表大小 (net.netfilter.nf_conntrack_max) 皆可能成為瓶頸。
  3. 未監控連線洩漏:應用端未正確關閉連線導致池耗盡,調大 max_connections 只能延緩不可避免的崩潰。**必須修復應用程式洩漏**。
  4. 混用長連線與短連線:長連線 (持久連線) 佔用槽位久,短連線頻繁建立銷毀。架構上應統一使用連線池管理。

總結:標準化調整流程

  1. 監控一週 Max_used_connections 峰值
  2. 目標 max_connections = 峰值 × 1.5 ~ 2 (留緩衝)
  3. 評估記憶體:max_connections × per_thread_buffers < 可用記憶體 70%
  4. 同步修改 my.cnf + SET GLOBAL 雙管齊下
  5. 調整 systemd LimitNOFILE、open_files_limit、table_open_cache、thread_cache_size、back_log
  6. 重啟驗證、建立監控告警、文件記錄變更

科學調整 max_connections,配合應用端連線池優化與持續監控,才能從根本上解決「Too many connections」問題,保障資料庫服務穩定性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved