MySQL报错"Too many connections"解决

前言

网站突然打不开,MySQL报"Too many connections",连接数满了。本文讲怎么排查和解决。

报错长什么样

ERROR 1040 (00000): Too many connections

意思是MySQL连接数超过最大限制了。

一、先紧急处理

查看当前连接数

SHOW STATUS LIKE 'Threads_connected';

查看最大连接数

SHOW VARIABLES LIKE 'max_connections';

默认一般是151或者100。

临时调大连接数

SET GLOBAL max_connections = 1000;

马上生效,不用重启。

二、查看谁占了连接

查看所有连接

SHOW FULL PROCESSLIST;

按用户统计

SELECT user, COUNT(*) FROM information_schema.processlist GROUP BY user;

按IP统计

SELECT SUBSTRING_INDEX(host, ':', 1) AS ip, COUNT(*) 
FROM information_schema.processlist 
GROUP BY ip;

杀掉多余连接

-- 杀掉Sleep的连接
KILL 连接ID;

批量杀:

SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist 
WHERE user = 'www' AND command = 'Sleep';

三、永久修改最大连接数

改my.cnf:

[mysqld]
max_connections = 1000

重启MySQL:

systemctl restart mysqld

四、为什么连接数会满

原因1:程序没关连接

每查一次数据库就新开一个连接,用完不关,连接越积越多。

解决:

  1. 用连接池
  2. 用完及时关连接

原因2:慢SQL占着连接

一条SQL跑10秒,请求一多,连接就占满了。

解决: 优化慢SQL,加快查询速度。

原因3:max_connections太小

默认151,大流量网站不够用。

解决: 调大到500或1000。

原因4:Sleep连接太多

大量空闲连接占着位置。

解决: 调小wait_timeout:

[mysqld]
wait_timeout = 60
interactive_timeout = 60

空闲60秒自动断开。

五、排查步骤

第一步:确认是不是真的满了

SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';

第二步:看谁占了连接

SHOW FULL PROCESSLIST;

第三步:找原因

是慢SQL?还是程序泄漏?还是连接数太小?

第四步:紧急处理

SET GLOBAL max_connections = 1000;

或者杀掉Sleep连接。

常见坑

坑1:改了配置不生效

改了my.cnf,重启了,还是151。

原因: 改错配置文件了。

解决: 确认MySQL读的是哪个配置文件:

mysql --help | grep my.cnf

坑2:max_connections调太大

调到10000,结果MySQL启动不了。

原因: 每个连接都要占内存,太多会把内存吃满。

解决: 一般500-1000够用了,别调太大。

坑3:连接泄漏没解决

调大了max_connections,过几天又满了。

原因: 程序有连接泄漏,没根本解决。

解决: 查代码,修连接泄漏问题。

坑4:max_user_connections限制

单个用户连接数也有限制。

查看:

SHOW VARIABLES LIKE 'max_user_connections';

总结

紧急处理三步:

  1. SHOW FULL PROCESSLIST 看谁占连接
  2. 杀掉多余连接
  3. 调大 max_connections

根本解决: 优化慢SQL + 修连接泄漏 + 用连接池。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:52