MySQL连接数问题根源多在应用层连接未释放或系统限制,而非单纯max_connections配置过低;需先查Threads_connected和PROCESSLIST中Sleep连接,再核对max_connections、系统文件描述符及应用连接池配置。

确认是不是真连满了,别一上来就改配置
报 ERROR 1040: Too many connections 不代表 MySQL 真的扛不住了,大概率是连接堆积在 Sleep 状态没释放。先执行:SHOW STATUS LIKE 'Threads_connected'; 看当前连接数;再跑 SHOW PROCESSLIST;,重点扫 Command 列为 Sleep、Time 超过 60 秒的行——这些基本是应用层漏关的连接。
如果 Threads_connected 远低于 max_connections(比如 256),但还是连不上,说明问题不在 MySQL 配置,而在操作系统文件描述符限制或连接池未回收。
- 查系统级限制:
cat /proc/$(pidof mysqld)/limits | grep "Max open files",若Max open files小于max_connections,改了也白搭 -
Max_used_connections接近max_connections才算真瓶颈;比例长期低于 10%,说明当前值设得过大,反而浪费内存 - Django、Laravel 等框架默认用长连接,ORM 不显式 close 就会一直挂着,尤其在 CLI 脚本或异步任务里容易忽略
动态 SET GLOBAL max_connections 只是临时止血
SET GLOBAL max_connections = 1000; 立即生效,但仅限本次运行周期。MySQL 重启后会回落到配置文件里的值,且该操作需要 SYSTEM_VARIABLES_ADMIN 权限(MySQL 8.0+ 才支持,5.7 及更早版本不支持热改)。
它适合快速验证是否是连接数硬上限导致的问题,不适合生产环境长期依赖。
- 动态修改后,必须同步检查
ulimit -n和 systemd 的LimitNOFILE,否则新值无法真正承载 - 每个连接平均吃掉 256KB~1MB 内存,设到 2000 就可能多占 2GB RAM,要结合
innodb_buffer_pool_size整体评估 - 别只调
max_connections,顺手看看wait_timeout(默认 28800 秒),Web 应用建议压到 300 秒以内,避免 Sleep 连接挂太久
真正起效得改 my.cnf + 重启 + 改系统限制
永久生效必须写配置文件。编辑 /etc/my.cnf 或 /etc/mysql/my.cnf,在 [mysqld] 段下加一行:max_connections = 600(按「单实例并发 × 实例数 × 1.5」估算,别拍脑袋填 2000)。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
但光改这里不够,Linux 默认单进程最多打开 1024 个文件,MySQL 每个连接至少占 1 个 fd,所以必须同步放开系统限制:
- 改 systemd service 文件:
/etc/systemd/system/mysqld.service,在[Service]下加LimitNOFILE=65536 - 执行
systemctl daemon-reload && systemctl restart mysqld - 重启后立刻验证:
cat /proc/$(pidof mysqld)/limits | grep "Max open files",确认Max open files≥ 设定的max_connections
比调 max_connections 更关键的是连接池和代码逻辑
就算把 max_connections 设到 2000,如果应用层连接池(如 HikariCP 的 maximumPoolSize)设成 500,又部署了 5 个实例,瞬间就能打满——而且池子里空闲连接还可能因为 wait_timeout 比池子自身的 idleTimeout 长而被 MySQL 主动断开,导致下次取连接时抛异常。
真正要盯住的不是 MySQL 的上限,而是连接生命周期是否闭环:
- HikariCP 必须设
connection-timeoutwait_timeout,推荐 30 秒;idle-timeout建议 600 秒以内 - PHP 用
mysqli要显式调mysqli_close($conn);PDO 虽有析构,但在长脚本中建议手动置$pdo = null - Java 里确保
try-with-resources或finally块里调connection.close(),别依赖 GC - 定期跑
SELECT ID, USER, HOST, TIME, STATE FROM information_schema.PROCESSLIST WHERE TIME > 300 AND COMMAND = 'Sleep';,自动 kill 异常长睡连接(配合脚本或监控告警)
最常被忽略的一点:max_connections 是全局硬上限,但单个用户还能被 MAX_USER_CONNECTIONS 单独限制,用 GRANT ... MAX_USER_CONNECTIONS 200; 查一下账号有没有被悄悄锁死。










