MySQL 8.4 报 Too many connections 时,先核对 max_connections 与当前连接数,再按时间采样拒绝计数和会话列表,确认连接来自哪些应用、是否被慢查询或未结束事务占住。结合连接池总容量判断原因后,再决定处理方式。

适用版本与排查前提

本文依据 2026 年 11 月 12 日查阅的 MySQL 8.4 官方手册整理,适用于 MySQL 8.4 实例。示例未在目标数据库实测。使用已授权的管理连接,核对实例、故障时间和应用错误。完整会话列表可能包含业务 SQL,共享结果前应脱敏。

普通连接槽位用完时,MySQL 为具有 CONNECTION_ADMIN 权限的账号保留一个额外连接,便于管理员诊断。该通道需要预先配置并可正常使用。MySQL 连接数耗尽官方说明

第一步,记录上限与连接状态

SELECT VERSION(), @@hostname, @@port, NOW();
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS WHERE Variable_name IN
('Threads_connected', 'Threads_running', 'Max_used_connections',
 'Connection_errors_max_connections', 'Uptime');

第一条记录版本、主机标识、端口和服务器时间,仍需结合管理平台确认具体实例。第二条读取当前连接上限。第三条一次取出相关全局状态,便于保存同一轮采样结果。

  • Threads_connected 表示当前已打开连接数,Threads_running 表示当前未处于休眠状态的线程数。
  • Max_used_connections 记录连接数高水位,用来辅助了解峰值。它没有提供峰值发生时间。
  • Connection_errors_max_connections 记录因达到 max_connections 而拒绝的连接数。相邻采样的增量能帮助判断这段时间是否仍在发生此类拒绝。
  • Uptime 是实例已运行的秒数,可辅助识别两轮采样之间是否发生重启。重启、状态重置或采样目标变化会影响计数比较,比较前要核对。

可记录故障期间的多轮结果,并与应用报错时间对照。故障后单次连接数下降,仍需查看当时的监控和错误记录。MySQL 全局状态变量说明

第二步,查看会话归属和当前操作

SHOW FULL PROCESSLIST;

重点对照 User、Host、db、Command、Time、State 和 Info,按应用来源识别会话集中在哪一组客户端。FULL 显示完整语句,Time 表示线程处于当前状态的秒数。拥有 PROCESS 权限才能查看全部线程,普通账号通常只能看到自己的线程。SHOW PROCESSLIST 官方参考

大量 Sleep 会话可能来自连接池预留,也可能与连接释放有关。先核对应用实例数量、每个实例的池上限、最小空闲数及连接归还逻辑。正在执行的会话如果长期等待,应把会话与请求、事务和等待链对应起来。本站的锁等待文章提供了进一步查询步骤。MySQL 8.4 锁等待与阻塞连接排查

第三步,核对连接池总容量

  1. 列出连接同一数据库的服务、批处理、管理工具及其副本数量,收集各自连接池配置。
  2. 估算所有应用副本的池上限之和,再考虑发布期间新旧副本同时运行、后台任务及管理连接的需求。将估算与实际采样对照。
  3. 检查请求结束后的连接归还、异常路径、事务提交或回滚,以及业务高峰时连接占用时间。
  4. 需要调整池容量或数据库上限时,结合内存、并发执行能力和业务容量评估,由负责人员按变更流程实施。

以上是根据容量与会话证据组织的排查顺序。具体处理取决于连接来源和事务语义,本文没有执行连接清理、参数修改或业务负载测试。

验证方法与常见问题

处理后在相同实例按合理间隔重复第一步采样,并观察同一业务高峰窗口。确认连接数有可解释的余量、拒绝计数增量停止增长,应用建连错误及请求延迟恢复到实际要求。保留处理时间和配置差异,便于复核。

Threads_connected 已下降,是否可以结束排查?

仍需核对故障时段。瞬时连接数会变化,要结合拒绝计数增量、监控峰值和应用日志确认是否只是流量暂时回落。

看到很多 Sleep,是否代表连接泄漏?

Sleep 表示会话当前空闲。应结合连接池设定、连接增长趋势和业务归还逻辑判断,并检查会话是否仍持有未结束事务。先确认连接归属及事务影响,再采取处理措施。