能强制进入,但必须用本地 socket 连接且仅限 root 用户;mysql 为 root 预留紧急通道,通过 unix socket 连接时跳过 max_connections 检查,允许额外一个连接,该机制专为本地 root 设计,不适用于 tcp(如 127.0.0.1)。
能强制进入,但必须用本地 socket 连接,且仅限 root 用户。mysql 为 root 预留了一个“紧急通道”:当 max_connections 耗尽时,root 仍可通过 mysql -uroot -p -s /var/lib/mysql/mysql.sock(路径依系统而异)连上,其他用户和远程连接全部拒绝。
为什么 socket 连接能绕过限制?
MySQL 内部对通过 Unix socket(或 Windows 命名管道)连接的 root 用户,会跳过 max_connections 检查,额外放行一个连接位。这不是 bug,是设计好的兜底机制。
- 该通道只对
localhost上的 root 生效,不适用于127.0.0.1(后者走 TCP,受限制) - socket 文件路径常见位置:
/var/lib/mysql/mysql.sock、/tmp/mysql.sock、/usr/local/mysql/tmp/mysql.sock,可用mysql --help | grep sock确认 - 如果 root 密码忘了,需临时跳过权限检查启动 MySQL(需停服,非紧急情况不推荐)
连进去后第一件事:看谁占满了连接
执行 SHOW PROCESSLIST;,重点关注 Command 列为 Sleep 的行 —— 它们是空闲但未释放的连接,通常来自 Navicat 的闲置标签页、应用未 close 的连接池、或长时间没操作的 GUI 会话。
-
Time列显示秒数,大于wait_timeout(默认 28800 秒)的Sleep连接本该自动断开,但若客户端没响应,MySQL 不会主动 kill - 用
KILL <code>id; 手动干掉可疑连接,例如KILL 12345;(ID 来自SHOW PROCESSLIST;第一列) - 别直接
KILL所有,先观察User和Host列,避免误杀正在跑重要任务的连接
临时调高上限只是缓兵之计
执行 SET GLOBAL max_connections = 1000; 可立即生效,但治标不治本 —— 如果 wait_timeout 太大(比如 8 小时),Sleep 连接积压速度远超释放速度,很快又满。
- 更有效的临时手段是缩短空闲等待时间:
SET GLOBAL wait_timeout = 300;(单位秒),让闲置连接 5 分钟后自动断开 - 这个设置重启 MySQL 后失效,要永久生效,得写进配置文件
my.cnf的[mysqld]段里 - 注意:
wait_timeout和interactive_timeout是两个独立参数,Navicat 属于交互式客户端,改前者即可
真正该检查的三个地方
连接打满从来不是单一配置问题,而是三层叠加的结果:
- Navicat 自身:每个打开的查询标签页、数据同步窗口、甚至未关闭的表结构编辑器,都维持一个连接。关掉不用的标签页比调参数更立竿见影
-
应用代码:检查是否有
Connection获取后未close(),或连接池maxIdle/maxActive设置不合理 -
服务器资源:
max_connections设太高(如 10000)可能触发 OS 文件描述符限制(ulimit -n),反而导致 MySQL 启动失败或不稳定
最常被忽略的是:很多人反复调高 max_connections,却从没关过 Navicat 里那十几个闲置的 SQL 标签页 —— 那些才是真正的连接黑洞。











