首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

解決 MySQL "Too many connections" 錯誤:max_connections 配置、連接池洩漏排查、線程緩存調優與監控體系

     編輯:MySQL 綜合教學

錯誤本質


ERROR 1040 (HY000): Too many connections

當前活躍連接數 (`Threads_connected`) 達到 `max_connections` 限制,新連接被拒絕。

核心參數

參數默認值最大值動態修改
max_connections151 (5.7+) / 100 (舊版)100,000 (實際受 OS 文件句柄、內存限制)✅ `SET GLOBAL max_connections=2000`
max_user_connections0 (無限制)同 max_connections✅ 限制單用戶佔用

即時調大 (無需重啟)


mysql> SET GLOBAL max_connections = 3000;
Query OK, 0 rows affected
mysql> SHOW VARIABLES LIKE 'max_connections';

**持久化:** 必須同步寫入 `/etc/my.cnf`:


[mysqld]
max_connections = 3000
# 配套調大
open_files_limit = 10000          -- OS ulimit -n 需同步調大
table_open_cache = 4000
thread_cache_size = 100           -- 緩存線程減少創建開銷
back_log = 200                    -- TCP 監聽隊列

排查:為什麼連接數暴增?

原因現象排查命令/代碼
應用連接池洩漏Threads_connected 持續增長不降代碼審查 `close()`/`returnConnection()`;監控池 `NumActive`/`NumIdle`
長事務/慢查詢堵塞連接被長時間佔用`SHOW PROCESSLIST` 看 `Time` 大、`State=Sending data`/`Locked`
連接池配置過大多實例合計超過 max_connections總連接池上限 ≤ max_connections * 0.8
無連接池 (短連接風暴)高併發下頻繁創建銷毀強制引入連接池 (HikariCP/Druid/Go sql.DB)
睡眠連接堆積`Command=Sleep` 大量佔用`wait_timeout`/`interactive_timeout` 調小 (如 60s);應用層定期驗證

監控與報警體系


# 關鍵指標 (Prometheus mysqld_exporter)
mysql_global_status_threads_connected        -- 當前連接數
mysql_global_variables_max_connections       -- 限制值
mysql_global_status_threads_created          -- 歷史創建線程總數 (持續增長正常)
mysql_global_status_aborted_connects         -- 失敗連接數 (報警)
mysql_global_status_connection_errors_max_connections -- 因滿拒絕次數 (核心報警)

# Grafana 報警規則
Threads_connected / max_connections > 0.85  -- 警告
Threads_connected / max_connections > 0.95  -- 嚴重
connection_errors_max_connections > 0       -- 立即報警

線程池插件 (高併發利器)

  • Percona Server / MariaDB 內置 **Thread Pool**。
  • MySQL 企業版內置 Thread Pool。
  • 社區版可用 `thread_pool` 插件 (需編譯/第三方)。
  • **原理:** 將數萬連接映射到少量工作線程組,避免上下文切換風暴,突破 `max_connections` 物理限制。

緊急臨時繞過


# 超級用戶保留連接 (默認 1 個)
SET GLOBAL max_connections = 3000;
-- 或臨時放大
SET GLOBAL max_connections = 5000;
-- 同時殺掉閒置睡眠連接
KILL ;  -- 批量腳本殺掉 Time > 60 的 Sleep 連接
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved