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”问题。关键步骤包括快速确认问题、临时提高连接上限、持久化配置、检查应用和业务逻辑,以及优化高并发场景。希望这份指南能帮助你高效解决问题。