报 error 1040 说明连接资源占满而非服务宕机,90% 情况无需调 max_connections,应先用 socket 直连查 threads_connected 和 threads_running 确认是否真满,再清理 sleep 连接、缩短 wait_timeout,并同步校准连接池与系统限制。

报 ERROR 1040 (HY000): Too many connections,说明 MySQL 已拒绝新连接——不是服务挂了,而是连接资源被占满。90% 的情况根本不用调 max_connections,先查连接状态、关 Sleep 连接、改超时设置,比盲目扩容更有效。
怎么确认是不是真连满了
别急着改配置,用 socket 直连(比如 mysql -S /tmp/mysql.sock -u root -p)执行两行命令:
-
SHOW STATUS LIKE 'Threads_connected';—— 看当前活连接数;如果接近max_connections值(默认 151),才可能是真爆满 -
SHOW STATUS LIKE 'Threads_running';—— 看真正干活的连接数;如果远小于前者(如 498 vs 3),说明大量连接卡在Sleep状态,大概率是应用没关连接 - 再跑
SELECT USER, HOST, COUNT(*) FROM information_schema.PROCESSLIST GROUP BY USER, HOST;,看是不是某个 IP 或账号异常占满连接
大量 Sleep 连接怎么快速清理
查出长时间空闲的连接后,不能只 kill,得先理解它们为什么不释放:
-
SHOW PROCESSLIST;里找Command = 'Sleep'且Time > 300的行,这些连接已空闲 5 分钟以上,基本可判定泄漏 - 临时清理可用
KILL,但更稳妥的是先缩紧超时:执行SET GLOBAL wait_timeout = 60;和SET GLOBAL interactive_timeout = 60;,让空闲连接 60 秒后自动断开 - 注意:
wait_timeout不影响正在执行的查询,只作用于空闲连接;改完要观察应用是否因频繁重连变慢 - 云数据库(如阿里云 RDS、腾讯云 CDB)可能不支持
KILL普通连接,需走控制台或专用管理端口
调 max_connections 为什么经常不生效
执行 SET GLOBAL max_connections = 1000; 后查值还是旧的?常见卡点不在 MySQL 本身:
- 系统级文件描述符限制挡住了:运行
ulimit -n,若返回 1024,而你设了 2000,MySQL 启动时会自动向下取整;需在 systemd service 文件(如/usr/lib/systemd/system/mysqld.service)的[Service]段加LimitNOFILE=65536,再systemctl --system daemon-reload && systemctl restart mysqld - 配置写错段落:
my.cnf中必须写在[mysqld]段下,写在[client]或全局段无效 - MySQL 8.0.22+ 用户可能已被
SET PERSIST覆盖:检查mysqld-auto.cnf,它优先级高于my.cnf - Docker 容器里没配
--ulimit,光改 MySQL 配置毫无意义
应用层连接池和内存限制必须同步校准
就算 max_connections 设到 1000,应用层没配合也会白搭:
- HikariCP 的
maximumPoolSize必须 ≤ MySQL 的max_connections,建议按 70% 配(如 MySQL 设 500,池子最多 350),留余量给后台线程和管理员连接 - 每个连接实际内存开销在 256KB~2MB 之间,取决于
sort_buffer_size、read_buffer_size等;16GB 内存机器设超 1000 极易触发 OOM - Java 应用中
connection-timeout默认 30 秒,网络抖动时连接卡在获取阶段会堆积;建议压到 10–15 秒,并开启leak-detection-threshold - MySQL 8.0+ 务必启用
admin_port(如admin_port = 33062),否则连接打满时连管理员都进不去,只能靠kill -TERM主进程
最常被忽略的一点:Max_used_connections 接近上限时就该预警,不是等报错才动手;另外,wait_timeout 和连接池的 idleTimeout 必须错开,且后者要短于前者,否则连接池以为连接还活着,MySQL 却已悄悄断开,导致后续请求拿到失效连接抛异常。











