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

MySQL 連線數調大實戰:從 100 到 5000 的動態修改與持久化配置

     編輯:MySQL 資料庫相關知識

現象:Too many connections

ERROR 1040 (00000): Too many connections

預設 max_connections = 151(舊版 100),高併發場景極易觸頂。

方案一:動態修改(立即生效,重啟失效)

mysql> SET GLOBAL max_connections = 5000;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@GLOBAL.max_connections;
+--------------------------+
| @@GLOBAL.max_connections |
+--------------------------+
| 5000                     |
+--------------------------+
注意: 語法為 SET GLOBAL max_connections = N 或 SET @@GLOBAL.max_connections = N,兩者等價。本文原文嘗試的 set @@global.max_connections=5000; 同樣正確。

方案二:配置檔持久化(重啟生效)

編輯 /etc/my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 區段加入:

[mysqld]
max_connections = 2000   # 建議 1000~5000 視記憶體而定

重啟服務:

systemctl restart mysqld   # 或 service mysqld restart

關鍵配套參數(必調,否則 OOM)

連線數規劃經驗值

  • Web 應用:max_connections = (峰值 QPS / 平均查詢時間) * 1.5,通常 500~2000 足夠。
  • 避免設 5000+:每連線佔 ~256KB 執行緒堆疊 + 緩衝區,5000 連線約 1.2GB 記憶體,極易觸發 OOM Killer。
  • 監控指標:Threads_connected / max_connections > 80% 告警;Aborted_connects 急增檢查應用連線池洩漏。

常見誤區

  1. 只改 my.cnf 不重啟 → 不生效。
  2. 只動態改不寫配置 → 重啟後失效。
  3. 忽略 OS 限制:ulimit -n 65535 需寫入 /etc/security/limits.conf 並重登生效。
  4. 以為連線數越大越好:超過 CPU 核心數 * 2 通常反而增加上下文切換開銷,建議配合連線池(HikariCP、Druid)限制應用端連線數。

驗證腳本

mysql -e "SHOW VARIABLES LIKE 'max_connections'; SHOW GLOBAL STATUS LIKE 'Threads_connected';"

總結

調大 max_connections 需「動態生效 + 配置持久化 + 記憶體/檔案描述符配套調大 + 連線池限流」四步走。切記:連線數不是越大越好,適度配合監控與連線池才是正解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數建議值說明
thread_cache_sizemin(100, max_connections/10)緩存執行緒,減少建立/銷毀開銷
open_files_limitmax_connections * 5OS 層面檔案描述符上限,需同步 ulimit -n
table_open_cachemax_connections * 2表快取,避免頻繁開關表
innodb_buffer_pool_size物理記憶體 60~70%InnoDB 核心快取,防止磁碟 I/O 成為瓶頸