先确认是否真不够用:执行show variables like 'max_connections'和show status like 'threads_connected',若后者长期接近前者(如151),再查show processlist看是否有大量sleep连接;90%问题源于连接泄漏或超时设置不当,而非上限不足。

查当前 max_connections 值是否真不够用
别一上来就改配置,先确认是不是真卡在连接数上。常见现象是应用报 Too many connections,或者 show processlist 返回的连接数长期接近 100 / 151(MySQL 5.7+ 默认值通常是 151)。执行以下命令验证:
mysql -u root -p -e "show variables like 'max_connections';"mysqladmin -u root -p variables | grep max_connections
注意:如果返回值是 214,大概率是用了官方 RPM 包安装的 MySQL,且系统级文件描述符限制没放开——这不是配置写错了,而是 systemd 拦住了。
临时调高:用 set GLOBAL 生效快但不持久
只适合应急,比如连接爆满导致服务不可用,需要立刻缓解。登录 MySQL 后执行:
mysql> SET GLOBAL max_connections = 1000;
立即生效,无需重启。但有三个硬限制:
- 该值不能超过 MySQL 编译时允许的上限(通常为 65535,但实际受内存和 OS 限制)
- 重启 MySQL 后恢复为配置文件或编译默认值
- 如果当前已有 150 个活跃连接,新设为 1000 不会“释放”已占连接,只是允许第 151~1000 个新连接进来
永久修改:改 my.cnf + 重启 + 验证顺序不能错
核心操作就三步,漏任何一步都可能白改:
- 找到真实生效的配置文件:
/usr/bin/mysql --verbose --help | grep -A 1 'Default options',优先检查/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf - 在
[mysqld]段下添加(不是[client]或文件末尾):max_connections = 1000 - 重启服务:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(CentOS/RHEL)
改完必须验证:mysql -u root -p -e "show variables like 'max_connections';"。如果还是旧值,重点查两件事:配置文件路径是否写错、systemctl status mysql 是否报 “Failed to reload configuration” 类错误。
改了还是卡住?检查 systemd 的 LimitNOFILE
这是最常被忽略的一环。MySQL 进程本身能开 1000 个连接,但 systemd 默认只给它分配 1024 个文件描述符(含 socket、日志、表文件等),实际可用远低于 1000。表现为:配置写了 1000,show variables 显示 1000,但连到 300 就开始拒绝新连接。
解决方法:
- 编辑服务文件:
sudo systemctl edit mysqld(或直接改/usr/lib/systemd/system/mysqld.service) - 在
[Service]段下加一行:LimitNOFILE=65535 - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart mysqld
再查 cat /proc/$(pgrep mysqld)/limits | grep "Max open files",确认 Soft Limit 和 Hard Limit 都是 65535。











