先确认是否真连满:用mysql -s /tmp/mysql.sock -uroot直连,执行show variables like 'max_connections'和show status like 'threads_connected';若threads_connected接近上限但threads_running极低(如498 vs 2),说明大量连接卡在sleep状态,主因是连接未释放而非并发高。

先确认是不是真连满了
别急着改配置,用 mysql -S /tmp/mysql.sock -uroot(本地 socket)直连,执行两条命令:SHOW VARIABLES LIKE 'max_connections'; 和 SHOW STATUS LIKE 'Threads_connected';。如果 Threads_connected 接近上限、但 Threads_running 极低(比如 498 vs 2),说明大量连接卡在 Sleep 状态,不是并发高,是连接没释放。
清理 Sleep 连接要小心
查出空闲太久的连接:SELECT ID, USER, HOST, TIME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Sleep' AND TIME > 600;。逐个 KILL,别用 KILL ALL 或脚本批量杀——可能误杀正在事务中的连接。特别留意 USER 为空或 HOST 是 unauthenticated user 的行,这往往是 DNS 解析失败或扫描行为,得查网络和防火墙。
调大 max_connections 前必须过三关
直接 SET GLOBAL max_connections = 1000; 经常无效,因为:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
-
ulimit -n返回值低于设定值(如返回 1024,却设 2000),MySQL 启动时会自动向下取整 - Docker 容器没加
--ulimit nofile=65536:65536,光改 MySQL 配置没用 - 内存扛不住:每个连接平均吃 512KB~2MB,设到 2000 就要 1~4GB 额外内存,容易触发 OOM
systemd 管理的服务,得在 /usr/lib/systemd/system/mysqld.service 的 [Service] 段加 LimitNOFILE=65536,再 systemctl --system daemon-reload && systemctl restart mysqld。
连接池配置比 MySQL 参数更关键
线上 90% 的连接堆积问题出在应用侧。比如 Druid,常见错配:
-
max-active设得比max_connections还高,多个服务一压就爆 -
min-idle和max-wait没调,连接用完不归还、等超时才扔,堆满Sleep -
remove-abandoned-on-maintenance开了但remove-abandoned-timeout太长,起不到及时回收作用
核心原则:idleTimeout(连接池)必须小于 wait_timeout(MySQL),否则池子里的空闲连接永远等不到 MySQL 主动断开,越积越多。










