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 | 正在执行的线程数 | 远小于连接数说明大量连接处于空闲 |
调大上限要同步确认操作系统的文件句柄限制与线程限制,否则参数改了但连接数仍然打不上去。
每个连接都有内存开销:把上限从几百直接调到几千甚至上万,内存可能先于连接数达到瓶颈。