MySQL 连接数打满(Too many connections)排查与根治
2026-08-11 01:32:30 # 数据库

应用突然大面积报错 Too many connections,是 MySQL 最典型的“雪崩”故障之一。本文讲清如何快速止血、再根治。

一、快速判断

1
2
3
SHOW VARIABLES LIKE 'max_connections';     -- 当前上限
SHOW STATUS LIKE 'Threads_connected'; -- 当前已用连接
SHOW PROCESSLIST; -- 看都是谁占着连接

Threads_connected 逼近 max_connections,新连接就会被拒。

二、临时止血

1
SET GLOBAL max_connections = 2000;   -- 临时调大(重启失效)

同时清理“占着不干活的”连接:

1
2
3
4
-- 找出 sleep 时间过长的连接
SELECT * FROM information_schema.PROCESSLIST
WHERE COMMAND='Sleep' AND TIME>3600;
KILL <id>; -- 谨慎,确认非正在事务

三、永久生效

my.cnf 调整并重启:

1
2
3
max_connections = 2000
wait_timeout = 28800 # 非交互连接空闲回收时间(秒)
interactive_timeout = 28800

四、根因与根治

连接打满通常不是“上限设小了”,而是连接泄漏

  • 应用连接池配置不当maxPoolSize 过大或连接未归还。检查 HikariCP/Druid 配置。
  • 慢查询堆积:一条慢 SQL 占住连接,请求排队把池子耗尽。先治慢查询。
  • sleep 连接过多wait_timeout 设得太大,及时回收空闲连接。

五、预防

  • 应用侧用连接池并设合理上限;
  • 监控 Threads_connected / max_connections 比例,超过 80% 告警;
  • 对核心库保留 superuser 连接余量(max_user_connections)。

小结

Too many connectionsSET GLOBAL 临时扩容 + KILL 空闲连接止血,再回头查连接池与慢查询,才是根治之道。