MySQL 8.0.17 “Too Many Connections” 排查與優化指南
在 MySQL 8.0.17 中,當出現“Too many connections”錯誤時,通常意味著數據庫連接數已達上限。這不僅會影響應用性能,還可能導致連接池(如 Druid)無法獲取新連接。以下是一個清晰簡潔的排查與優化指南,幫助你快速解決問題。
一、現象
MySQL 返回錯誤碼 1040,狀態碼 08004,提示“Too many connections”。Druid 連接池無法獲取連接。
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
二、快速確認
-
登錄 MySQL
-- 當前允許的最大連接數 SHOW VARIABLES LIKE 'max_connections';-- 當前已打開的連接數 SHOW STATUS LIKE 'Threads_connected';-- 歷史峰值 SHOW STATUS LIKE 'Max_used_connections';
-
查看當前連接明細
SHOW PROCESSLIST;
三、臨時方法
- 臨時提高連接上限
SET GLOBAL max_connections = 300; -- 根據內存評估
四、服務器端配置
-
修改配置文件(my.cnf / my.ini)
[mysqld] max_connections = 300 # 建議 300~500 起步 wait_timeout = 300 # 5 分鐘后回收空閑連接 interactive_timeout = 300
重啟 MySQL 使配置生效,或使用:
SET PERSIST max_connections = 300;
-
啟用自適應參數(單機專用服務器推薦)
[mysqld] innodb_dedicated_server = ON
五、應用側檢查
-
檢查連接池配置
spring.datasource.druid.max-active=50 spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-wait=3000 spring.datasource.druid.remove-abandoned=true spring.datasource.druid.remove-abandoned-timeout=60 spring.datasource.druid.log-abandoned-connections=true
-
確保資源正確關閉
在代碼中確保Connection
、Statement
和ResultSet
在finally
塊中關閉,防止連接泄露。
六、業務側檢查
-
監控業務流量
- 檢查業務高峰期的流量,確認是否有異常流量導致連接數激增。
- 使用監控工具(如 Prometheus、Grafana)實時監控業務流量。
-
分析業務邏輯
- 檢查業務代碼中是否有不必要的數據庫連接操作。
- 優化業務邏輯,減少不必要的數據庫請求。
七、高并發優化
-
引入連接代理
- 使用 ProxySQL、MySQL Router 或 ShardingSphere-Proxy 進行連接復用。
-
讀寫分離
- 使用 InnoDB ReplicaSet 快速拉起只讀實例,分擔主庫壓力。
-
關閉死鎖檢測(極端寫場景)
SET GLOBAL innodb_deadlock_detect = OFF;
八、一鍵檢查腳本(Linux)
mysql -uroot -p'密碼' -e "
SELECT @@max_connections AS max_conn,VARIABLE_VALUE AS threads_conn
FROM performance_schema.global_status
WHERE VARIABLE_NAME='Threads_connected';
"
九、小結流程
發現 1040 → 查看 max_connections / Threads_connected → 臨時 SET GLOBAL → 配置 my.cnf → 重啟 → 檢查應用池設置 → 檢查業務邏輯 → 長期監控
十、總結
通過以上步驟,你可以快速定位并解決 MySQL 8.0.17 的“Too many connections”問題。關鍵步驟包括快速確認問題、臨時提高連接上限、持久化配置、檢查應用和業務邏輯,以及優化高并發場景。希望這份指南能幫助你高效解決問題。