MySQL报错"Too many connections"解决
时间:2026-10-8 07:52 作者:emer 分类: 无
前言
网站突然打不开,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:程序没关连接
每查一次数据库就新开一个连接,用完不关,连接越积越多。
解决:
- 用连接池
- 用完及时关连接
原因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';
总结
紧急处理三步:
SHOW FULL PROCESSLIST看谁占连接- 杀掉多余连接
- 调大
max_connections
根本解决: 优化慢SQL + 修连接泄漏 + 用连接池。
遇到问题加QQ23979811 协助处理