mysql中连接数超出限制的排查与解决方法

来源:这里教程网 时间:2026-02-28 20:49:39 作者:

查看当前连接数和最大连接限制

MySQL 连接数超限最直接的表现是客户端报错

Too many connections
。先确认实际连接数和配置上限,避免误判:

执行
SHOW VARIABLES LIKE 'max_connections';
查看允许的最大并发连接数(默认通常为 151)
执行
SHOW STATUS LIKE 'Threads_connected';
获取当前活跃连接数
执行
SHOW PROCESSLIST;
SELECT * FROM information_schema.PROCESSLIST;
查看具体连接来源、状态、运行时长

注意:普通用户可能无权查

information_schema.PROCESSLIST
,需用有
PROCESS
权限的账号(如 root)。

识别长连接、空闲连接和异常连接

大量

Sleep
状态连接常是应用未正确关闭连接导致的;而长时间
Query
Locked
状态则可能卡在慢查询或锁等待上。

Sleep
状态且
Time
值很大(比如 > 300 秒):大概率是应用端连接池未回收、或设置了过长的
wait_timeout
/
interactive_timeout
Query
状态持续数分钟以上:用
SHOW FULL PROCESSLIST;
看 SQL 内容,结合
EXPLAIN
分析是否缺少索引或存在全表扫描
Locked
Waiting for table metadata lock
:说明被 DDL(如
ALTER TABLE
)阻塞,需检查是否有长事务或未提交事务

临时释放连接与调整配置

紧急情况下需快速释放资源,再考虑长期优化:

手动 Kill 异常连接:
KILL <code>id
;(
id
来自
SHOW PROCESSLIST
输出),慎杀
system user
或主从复制线程
临时调高上限(仅限应急):
SET GLOBAL max_connections = 500;
,但该值不能超过
max_connections
的编译上限,且重启后失效
缩短空闲连接超时:
SET GLOBAL wait_timeout = 60;
SET GLOBAL interactive_timeout = 60;
,让闲置连接更快释放

这些

SET GLOBAL
操作需 SUPER 权限,且不建议设得过低(如

应用层连接池与 MySQL 配置协同优化

单纯调大

max_connections
是治标,连接泄漏或低效使用才是根源。关键要对齐应用连接池参数与 MySQL 超时设置:

若用 HikariCP,确保
connection-timeout
wait_timeout,且
idle-timeout
max-lifetime
合理(例如分别设为 300000 和 1800000)
若用 Druid,检查
minIdle
是否过高、
removeAbandonedOnBorrow
是否启用,避免连接堆积
MySQL 配置文件中应持久化设置:
max_connections = 300
wait_timeout = 300
interactive_timeout = 300
,并重启 mysqld 生效
务必监控连接数趋势(如通过 Prometheus + mysqld_exporter),而不是等报警才介入

很多问题其实出在「应用没 close(),MySQL 又等太久才断」——两边超时没对齐,是最容易被忽略的协同盲区。

相关推荐