error 1040时应优先用socket直连(如mysql -s /var/run/mysqld/mysqld.sock -u root)执行show variables like 'max_connections'和show status like 'threads_connected'诊断,再结合max_used_connections、系统ulimit及连接池配置根治泄漏问题。

直接用 socket 连接绕过网络层限制
当报 ERROR 1040 (HY000): Too many connections 时,常规 TCP 连接已被全部占满,但 MySQL 默认保留一个 Unix socket 本地管理通道(哪怕 max_connections 耗尽也通常可用)。只要能登录数据库服务器本机,就还能救。
关键操作是跳过网络栈,直连 socket 文件:
- 确认 socket 路径:
mysql --socket=/var/run/mysqld/mysqld.sock -u root -p(路径常见于/var/run/mysqld/mysqld.sock或/tmp/mysql.sock,可通过mysqld --verbose --help | grep "socket"查) - 若提示权限拒绝,说明 mysqld 运行用户(如
mysql)没给当前用户读 socket 的权限,可临时切到该用户执行:sudo -u mysql mysql --socket=... -u root -p - 成功后立即执行两条命令确认水位:
SHOW VARIABLES LIKE 'max_connections';和SHOW STATUS LIKE 'Threads_connected';
查 unauthenticated user 是不是被扫爆了
大量 unauthenticated user 出现在 SHOW PROCESSLIST 里,基本不是业务问题,而是客户端发起连接后卡在 DNS 解析或认证阶段——常见于监控探针、脚本误配、或暴力扫描。
这类连接不执行 SQL,但长期卡在 Connect 状态,会真实占用连接槽位。重点看:
-
HOST字段是否集中(如全是同一云监控 IP 或内网网段) -
TIME是否持续增长(>60 秒未完成认证) -
STATE是否为Connecting to master、Receiving from client等非正常态 - 若确认是干扰流量,可临时禁用对应来源的防火墙规则,或在 MySQL 层加
skip-name-resolve避免 DNS 卡顿
别只看 Threads_connected,盯紧 Max_used_connections
Threads_connected 是瞬时快照,可能刚杀完一批连接就回落;而 Max_used_connections 记录的是自上次启动以来的历史峰值——它才是判断“是不是真撑不住”的铁证。
执行:SHOW STATUS LIKE 'Max_used_connections';,再对比 max_connections:
- 若
Max_used_connections / max_connections > 0.8,说明已长期高负载,不是突发抖动 - 若两者几乎相等(比如 499/500),且
Threads_running ,基本锁定为连接泄漏,不是容量不够 - 此时调大
max_connections只是延缓爆炸时间,必须立刻查应用层close()是否漏写、连接池max-active是否设得离谱
SET GLOBAL 之前先看系统级文件描述符是否卡死
执行 SET GLOBAL max_connections = 1000; 后发现没生效?大概率是 Linux 层拦住了。
MySQL 每个连接至少消耗 1 个文件描述符,而系统默认 ulimit -n 往往只有 1024。检查三处:
- 当前 mysqld 进程实际限制:
cat /proc/$(pgrep mysqld)/limits | grep "Max open files" - systemd 服务配置(如 MariaDB):
LimitNOFILE是否在/usr/lib/systemd/system/mariadb.service里显式设低 - Docker 容器场景:是否漏加
--ulimit nofile=65536:65536,光改 MySQL 配置无效 - 若 ulimit 确实不足,必须先改系统限制,再
SET GLOBAL,否则命令静默失败或触发 OOM
真正难处理的从来不是“连不上”,而是连上之后发现 Threads_connected 每分钟涨 20 个却找不到源头——这时候得翻应用日志、抓包看客户端建连频率,或者开 performance_schema 记连接生命周期。临时提权只是抢出排查窗口,不是终点。











