MySQL · 错误码速查
MySQL 错误 1040:连接数到顶了,先看 max_connections 和谁占着不放
客户端连上来时报 Too many connections,说明当前已被占用的连接达到了 max_connections。服务器实际允许 max_connections + 1 条连接,多出来的那条留给带 CONNECTION_ADMIN(或已废弃的 SUPER)权限的账号,方便管理员还能登进去看 SHOW PROCESSLIST。
官方原文
Too many connections官方 troubleshooting 页:客户端遇到 Too many connections,说明可用连接都被其他客户端占满。允许的连接数由 max_connections 控制;要支持更多连接就调大它。
出处:MySQL 8.4 Error Reference:Server Error Message Reference 最后核对:
| 错误号 / 符号 | 1040 / ER_CON_COUNT_ERROR | 出处 |
|---|---|---|
| SQLSTATE | 08004 | 出处 |
| 控制参数 | max_connections:同时允许的客户端数;本机 8.0.46 默认/当前值常见为 151(以 SHOW VARIABLES 为准) | 出处 |
| 实际上限 | max_connections + 1;多出的 1 条留给 CONNECTION_ADMIN / SUPER 账号 | 出处 |
| 相邻错误 | 1045 是身份验证失败;2003 是根本连不上服务器;2013 是查询过程中连接丢失 | 出处 |
1040 到底卡在哪一层
1040 发生在已经接触到 mysqld、但服务器拒绝再接受一条普通连接的时候。官方原文:“If clients encounter Too many connections errors when attempting to connect to the mysqld server, all available connections are in use by other clients.”(Too many connections)
- 不是密码错:密码/账号匹配失败是 1045。
- 不是网络不通:连不上主机或端口通常是客户端 2003。
- 是名额满了:Threads_connected(或 PROCESSLIST 行数)已经顶到
max_connections。
为什么管理员有时还能登进去:+1 保留连接
官方写明:mysqld 实际允许 max_connections + 1 条客户端连接。多出来的那条专门留给拥有 CONNECTION_ADMIN 权限(或已废弃的 SUPER)的账号。把该权限只授给管理员、不授给普通业务账号后,即使普通连接已经满了,管理员仍可能连上去执行 SHOW PROCESSLIST 看是谁占着。(Too many connections)
业务账号如果也有 CONNECTION_ADMIN/SUPER,就会和你抢那第 +1 条,排障通道就没了。授权时把管理权限和业务权限分开。
只读:容量、占用来源、睡死的连接
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Aborted_connects';
SHOW GLOBAL STATUS LIKE 'Connection_errors_max_connections';
SELECT user, host, db, command, time, state,
LEFT(info, 80) AS info_head
FROM information_schema.PROCESSLIST
ORDER BY time DESC
LIMIT 50;
SELECT user, COUNT(*) AS conns,
SUM(command = 'Sleep') AS sleeping
FROM information_schema.PROCESSLIST
GROUP BY user
ORDER BY conns DESC;Connection_errors_max_connections 会累计因达到 max_connections 被拒的次数。Sleep 时间很长的连接常来自连接池配置过大、泄漏或忘了关连接——先看清来源,再决定是调池、杀会话,还是改 max_connections。
先分流,再谈调大 max_connections
| 现象 | 优先动作 |
|---|---|
| 大量 Sleep 且 Time 很长 | 查应用/连接池 idle 超时与最大连接;必要时终止空闲会话(需授权) |
| 同一 user 连接数异常高 | 按账号看是哪套服务;核对池大小与副本数 |
| Max_used_connections 长期顶满 | 容量评估:调大 max_connections 要同步看内存与线程开销 |
| 只有高峰短时顶满 | 先看是否可排队/限流;盲目调大可能把内存打满 |
官方对调参的表述很直接:要支持更多连接,就把 max_connections 调大。实际环境里还要给线程、排序缓冲、每个连接的会话内存留余量;更系统的只读容量卡见学习包与连接容量长文。
和 1045、2003、2013 怎么分
| 错误 | 原文要点 | 和 1040 的区别 |
|---|---|---|
1045 ER_ACCESS_DENIED_ERROR | Access denied for user ... (using password: YES/NO) | 凭据或账号匹配失败,不是名额问题 |
| 2003(客户端) | Can't connect to MySQL server | 根本没连上主机/端口/套接字 |
| 2013(客户端) | Lost connection to MySQL server during query | 已经连上,查询过程中断开 |
常见问题
mysql 1040 Too many connections 是什么意思?
1040(ER_CON_COUNT_ERROR,SQLSTATE 08004)表示普通客户端连接数已经达到 max_connections,服务器拒绝再接受新的普通连接。
连接满了管理员还能登录吗?
有可能。mysqld 允许 max_connections+1 条连接,多出的一条留给拥有 CONNECTION_ADMIN(或 SUPER)权限的账号,便于登录后执行 SHOW PROCESSLIST。
1040 是不是把 max_connections 调大就好了?
官方说要支持更多连接就调大 max_connections。但若根因是连接泄漏或池过大,只调大参数会把内存和线程压力一起抬上去。先用 PROCESSLIST 看是谁占着。
怎么确认最近有没有因连接满被拒?
看状态变量 Connection_errors_max_connections 是否在增加;同时对比 Threads_connected 与 max_connections、Max_used_connections。
1040 和 1045、2003 怎么区分?
1040 是名额满了;1045 是账号/密码没通过;2003 是客户端根本连不上服务器。先看报错号,再对症查。
下一步
价格以对应页面当前标价为准。
出处(最后核对 2026-10-28)
- MySQL 8.4 Error Reference:Server Error Message Reference
- MySQL 8.4 Reference Manual B.3.2.5:Too many connections
- MySQL 8.4 Reference Manual:Server System Variables(max_connections)
本页摘录并解读上面列出的官方文档,不是官方页面;官方文档更新后以官方为准。本页内容都来自官方文档,没有我们自己的测试结果。