首页/数据/数据库速查/max_connections 与连接数管理

max_connections 与连接数管理

连接上限与 Too many connections 报错:排查现有连接来源、调大上限或优化连接池,Emergency 超级账号可应急进入。

数据库速查数据更新于 2026-10-13

max_connections 是什么

max_connections 限制 MySQL 允许的并发客户端连接数,默认 151。达到上限后新连接直接报 Too many connections。调大参数只是最表面的动作,真正要回答的是:现有连接是哪来的、有没有泄漏、业务连接池配得是否合理。

基本信息

参数名max_connections,GLOBAL 动态可改
默认值151
应急通道具备 CONNECTION_ADMIN 权限的账号可以超出上限连接
历史峰值Max_used_connections 记录曾经达到的最高并发
系统限制还受操作系统文件句柄与线程数上限约束

典型使用场景

  • 报错 Too many connections:先按来源聚合连接,判断是业务增长还是泄漏
  • 容量规划:用历史峰值而不是当前值决定上限,为促销留出余量
  • 连接来源审计:找出连接数异常偏多的应用或主机,从源头治理
  • 应急介入:用带管理权限的账号登入,清理空闲连接后再调整参数
  • 配合超时参数:把空闲连接超时与连接池回收策略一起调整,避免连接长期堆积

排查与调整

排查与调整
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';      -- 当前连接数
SHOW STATUS LIKE 'Max_used_connections';   -- 历史峰值
SHOW STATUS LIKE 'Aborted_connects';       -- 建连失败次数
SHOW STATUS LIKE 'Threads_running';        -- 真正在执行的数量
SHOW PROCESSLIST;                          -- 看到具体是谁、在跑什么
SET GLOBAL max_connections = 2000;         -- 动态调大,同时写配置文件

按来源聚合连接

按来源聚合连接
-- 按客户端主机统计连接数,快速找出异常来源
SELECT SUBSTRING_INDEX(host, ':', 1) AS src, COUNT(*) AS n
FROM information_schema.processlist
GROUP BY src ORDER BY n DESC LIMIT 20;
-- 找出长时间空闲的连接
SELECT id, user, host, command, time, state
FROM information_schema.processlist
WHERE command = 'Sleep' AND time > 600 ORDER BY time DESC;

输出逐列读法

状态变量含义判读
Threads_connected当前打开的连接数持续贴近上限说明容量或泄漏有问题
Max_used_connections历史最高并发连接数容量规划的主要依据
Aborted_connects连接建立失败次数增长说明客户端在连接阶段就被拒绝
Threads_running正在执行的线程数远小于连接数说明大量连接处于空闲
调大上限要同步确认操作系统的文件句柄限制与线程限制,否则参数改了但连接数仍然打不上去。
每个连接都有内存开销:把上限从几百直接调到几千甚至上万,内存可能先于连接数达到瓶颈。

易错点

  • 报错就调大上限:连接泄漏与连接池配置错误仍在,只是把故障推迟到下一次高峰
  • 改完参数不改操作系统限制:文件句柄与线程上限卡住实际可用连接数
  • 只看当前连接数做容量规划:必须看历史峰值,否则扩容永远滞后
  • 忘记给管理账号保留权限:连接打满时无法登入处理,只能重启实例

数据来源与参考

  • MySQL 8.0 Reference Manual: Too many connections

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌