如何查看MySQL当前连接数和最大连接限制_max_connections并动态调整?
- 内容介绍
- 文章标签
- 相关推荐
本文共计869个文字,预计阅读时间需要4分钟。
直接连接MySQL并执行以下命令即可,无需猜测、无需配置文件:
-
SHOW VARIABLES LIKE 'max_connections';—— 看服务端允许的最大并发连接数(比如返回151或500) -
SHOW STATUS LIKE 'Threads_connected';—— 看此刻真实活着的连接数(不是SHOW PROCESSLIST的行数,但数值一致)
注意:Threads_connected 是瞬时值,会随应用建连/断连实时变化;而 max_connections 是硬限制,超了就报 ERROR 1040: Too many connections。别把 SHOW PROCESSLIST 当连接总数看——普通账号只能看到自己发起的连接,Threads_connected 才是全量。
SET GLOBAL max_connections 生效但不持久
这条命令能立刻抬高上限,但只活到下次 MySQL 重启:
- 执行前必须有
SUPER权限,普通应用账号会报ERROR 1227 (42000): Access denied - 如果报
ERROR 1238 (HY000): Variable 'max_connections' is a read only variable,说明启用了--skip-grant-tables或设置了read_only=ON,此时动态改无效 - 改完立刻生效,不用 reload,但得确认操作系统没卡住文件描述符:
ulimit -n至少要比新值大 20%(比如设到 600,ulimit -n建议 ≥ 720)
常见误操作:在容器里跑 SET GLOBAL,结果容器重建后一切归零——因为没写进配置,也没做启动脚本固化。
永久生效必须改 my.cnf/my.ini 的 [mysqld] 段
Linux 下通常在 /etc/my.cnf 或 /etc/mysql/my.cnf,Windows 是安装目录下的 my.ini。只加这一行:
max_connections = 500
然后重启服务:
- systemd 系统:
sudo systemctl restart mysql(或mariadb) - 旧式 init:
sudo service mysql restart - 云数据库(如阿里云 RDS、腾讯云 CDB)不支持直接改配置文件,得走控制台参数模板或提工单
改完别忘了验证:SHOW VARIABLES LIKE 'max_connections'; 确认值已更新。如果还是老值,检查是否写错了段落(必须在 [mysqld] 下,写到 [client] 或文件末尾无效),或者被启动参数(如 --max_connections=200)覆盖。
调大连接数前先看 Max_used_connections 和资源余量
光看 max_connections 数值没意义,关键看历史峰值和服务器扛不扛得住:
- 查历史最高用过多少:
SHOW GLOBAL STATUS LIKE 'Max_used_connections';,如果长期Max_used_connections / max_connections < 0.5,说明上限设太高,白耗内存 - 每个连接至少占几 MB 内存,1G 内存的机器设到 500 很可能触发
Cannot allocate memory - 连接池配置比服务端调参更重要:Spring Boot 默认 HikariCP 的
maximum-pool-size设成 20,却把 MySQLmax_connections拉到 1000,纯属浪费
真正卡住的往往不是上限数字,而是连接泄漏(应用没 close)、长事务阻塞、或 DNS 解析失败导致认证连接堆积——这些得靠 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60; 和慢日志一起排查,不是改个 max_connections 就能绕过去的。
本文共计869个文字,预计阅读时间需要4分钟。
直接连接MySQL并执行以下命令即可,无需猜测、无需配置文件:
-
SHOW VARIABLES LIKE 'max_connections';—— 看服务端允许的最大并发连接数(比如返回151或500) -
SHOW STATUS LIKE 'Threads_connected';—— 看此刻真实活着的连接数(不是SHOW PROCESSLIST的行数,但数值一致)
注意:Threads_connected 是瞬时值,会随应用建连/断连实时变化;而 max_connections 是硬限制,超了就报 ERROR 1040: Too many connections。别把 SHOW PROCESSLIST 当连接总数看——普通账号只能看到自己发起的连接,Threads_connected 才是全量。
SET GLOBAL max_connections 生效但不持久
这条命令能立刻抬高上限,但只活到下次 MySQL 重启:
- 执行前必须有
SUPER权限,普通应用账号会报ERROR 1227 (42000): Access denied - 如果报
ERROR 1238 (HY000): Variable 'max_connections' is a read only variable,说明启用了--skip-grant-tables或设置了read_only=ON,此时动态改无效 - 改完立刻生效,不用 reload,但得确认操作系统没卡住文件描述符:
ulimit -n至少要比新值大 20%(比如设到 600,ulimit -n建议 ≥ 720)
常见误操作:在容器里跑 SET GLOBAL,结果容器重建后一切归零——因为没写进配置,也没做启动脚本固化。
永久生效必须改 my.cnf/my.ini 的 [mysqld] 段
Linux 下通常在 /etc/my.cnf 或 /etc/mysql/my.cnf,Windows 是安装目录下的 my.ini。只加这一行:
max_connections = 500
然后重启服务:
- systemd 系统:
sudo systemctl restart mysql(或mariadb) - 旧式 init:
sudo service mysql restart - 云数据库(如阿里云 RDS、腾讯云 CDB)不支持直接改配置文件,得走控制台参数模板或提工单
改完别忘了验证:SHOW VARIABLES LIKE 'max_connections'; 确认值已更新。如果还是老值,检查是否写错了段落(必须在 [mysqld] 下,写到 [client] 或文件末尾无效),或者被启动参数(如 --max_connections=200)覆盖。
调大连接数前先看 Max_used_connections 和资源余量
光看 max_connections 数值没意义,关键看历史峰值和服务器扛不扛得住:
- 查历史最高用过多少:
SHOW GLOBAL STATUS LIKE 'Max_used_connections';,如果长期Max_used_connections / max_connections < 0.5,说明上限设太高,白耗内存 - 每个连接至少占几 MB 内存,1G 内存的机器设到 500 很可能触发
Cannot allocate memory - 连接池配置比服务端调参更重要:Spring Boot 默认 HikariCP 的
maximum-pool-size设成 20,却把 MySQLmax_connections拉到 1000,纯属浪费
真正卡住的往往不是上限数字,而是连接泄漏(应用没 close)、长事务阻塞、或 DNS 解析失败导致认证连接堆积——这些得靠 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60; 和慢日志一起排查,不是改个 max_connections 就能绕过去的。

