萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL "Too many connections" 連接數耗盡:根因分析、緊急擴容與長效治理

錯誤現象

ERROR 1040 (HY000): Too many connections

當前活躍連接數達到 max_connections 上限(默認 151),新連接被拒絕。

緊急擴容:動態調整立即生效

mysql> SET GLOBAL max_connections = 3000;
mysql> SET GLOBAL wait_timeout = 30;
動態修改**無需重啟**,僅對新連接生效。但重啟後失效,**必須同步修改配置文件**。

永久配置:my.cnf / my.ini

[mysqld]
max_connections = 3000
wait_timeout = 30
interactive_timeout = 30
max_user_connections = 2000  # 單用戶上限,防單用戶佔滿

修改後 systemctl restart mysqld 生效。

查看當前狀態與歷史峰值

-- 當前連接數
SHOW STATUS LIKE 'Threads_connected';

-- 歷史最大連接數
SHOW STATUS LIKE 'Max_used_connections';

-- 配置上限
SHOW VARIABLES LIKE 'max_connections';

根因深度排查:為什麼連接數會飆升?

1. 應用層連接池配置失當(最常見)

問題表現修正
最大連接數過大池大小 > max_connections池大小 ≤ max_connections * 0.8
最小閒置連接過多長期佔用大量空閒連接minIdle 設置較小,maxIdle 控制上限
未正確關閉連接泄漏導致連接不可復用代碼審查、finally 塊關閉、用 try-with-resources
長事務持有連接事務未提交/回滾拆分長事務、設置連接借用超時

2. SQL 執行緩慢導致連接堆積

  • 慢查詢佔用連接時間長 → 並發連接數上升
  • 排查:SHOW PROCESSLIST 觀察 Time 列大、State 為 Sending data/Locked
  • 治理:開啟慢查詢日誌、分析 Top SQL、加索引/改寫 SQL/分庫分表

3. 連接風暴:突發流量、爬蟲、死循環重試

  • 前端無限制重試 → 連接指數級增長
  • 對策:客戶端指數退避重試、網關限流、熔斷降級

4. 睡眠連接佔槽

SHOW PROCESSLIST WHERE Command = 'Sleep' AND Time > 60;

治理:降低 wait_timeout、連接池設置 validationQuery、testOnBorrow、evictionPolicy 清理空閒連接。

監控與告警體系

# 關鍵指標
Threads_connected / max_connections > 0.8  → 告警
Aborted_connects 突增                    → 告警
Threads_running 高位持續                 → 慢查詢排查

架構層面長效方案

  1. 讀寫分離:主庫寫、從庫讀,分散連接壓力
  2. 連接池中間件:ProxySQL、MyCat 統一管理連接、複用、限流
  3. 分庫分表:業務拆分降低單庫並發
  4. 緩存層:Redis 吸收高頻讀請求,減少 DB 連接

總結

Too many connections 表象是連接數上限,本質是**連接使用效率低**或**並發超出架構承載**。治理路徑:**動態擴容救急 → 配置文件固化 → 連接池優化 → 慢查詢治理 → 架構演進(讀寫分離/分庫分表/緩存)**。建立連接數水位監控,預留 20% 紅線空間,從容應對流量洪峰。

copyright © 萬盛學電腦網 all rights reserved