首页/系统/信创系统运维速查/数据库连接数过多的处理
常见问题65 条

数据库连接数过多的处理

报 Too many connections:看当前并发与上限、找占用来源(连接池、慢查询积压、异常重连),完止血再决定扩容或治理。

信创系统运维速查系统更新于 2026-10-13

连接数过多的含义

数据库的连接数上限是一个硬性配额,达到上限后新连接会被直接拒绝,业务表现为登录失败、部分请求报错。触发原因可能是业务并发自然增长,也可能是连接没有被及时归还,比如应用侧连接池配置过大、长事务占用连接不放、异常重连不断堆积。

止血与治理要分开做

紧急情况下可以临时调高上限让业务先恢复,但这只是止血:每个连接都占用内存,上限调得过高会把压力转移到内存与调度上。真正解决问题需要回到来源侧,检查连接池上限之和是否超过数据库上限、是否存在长事务与空闲连接大量滞留。

基本信息

关键参数最大连接数、当前连接数、运行线程数
观察入口当前进程列表与会话状态统计
临时处置动态调整上限,重启后按配置文件恢复
根治方向连接池配置、超时回收、慢查询与长事务治理

典型使用场景

  • 业务高峰期报连接数超限,需要快速恢复可用性
  • 应用扩节点后连接数被迅速打满,需要重新规划配额
  • 排查大量空闲连接来源,确认是否为连接泄漏
  • 数据库迁移或割接期间连接数异常升高
  • 容量评估时核算连接数上限与内存开销的平衡点

查看现状

查看现状
mysql -uroot -p -e "SHOW VARIABLES LIKE 'max_connections'"
mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_connected'"
mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_running'"
mysql -uroot -p -e 'SHOW PROCESSLIST' | head -30
# 关注 Sleep 状态连接的占比与持续时长

止血与治理

止血与治理
mysql -uroot -p -e 'SET GLOBAL max_connections = 500'   # 动态调整,重启前有效
# 治理方向:
# 1) 应用连接池上限与数据库上限一起规划,两者之和不超过数据库配额
# 2) 配置空闲连接回收与最大生存时间,避免长期占用
# 3) 治理慢查询与长事务,缩短连接持有时间
# 4) 抑制异常重连风暴,给重试加退避

现象与判断

现象可能原因方向
新连接被拒绝连接数达到上限临时扩容并排查来源
大量空闲连接应用未及时归还连接检查连接池回收配置
运行线程数长期偏高慢查询或长事务堆积定位慢语句并优化
连接数阶梯式上升服务扩容或重连风暴核对实例数与重试策略
内存使用同步上升连接内存开销累积评估配额与内存的平衡
大幅调高上限会推高内存占用,连接内存乘以并发量可能直接影响数据库稳定性。先定位来源,再决定是治理还是扩容,避免把问题从连接层面转移到内存层面。

易错点

  • 只调高上限不做治理,连接数持续增长最终引发内存与调度压力,问题变成更难处理的形态
  • 应用各节点连接池上限之和超过数据库配额,扩容节点时反而更早打满
  • 把大量空闲连接当成正常现象,实际是连接泄漏在不断累积
  • 动态调整的参数没有同步写入配置文件,重启后恢复旧值,业务再次受影响

数据来源与参考

  • MySQL 官方文档(连接管理)
  • MySQL 官方文档(服务器状态变量)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌