如何查看MySQL当前连接数和最大连接限制_max_connections并动态调整?

2026-04-29 01:192阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计869个文字,预计阅读时间需要4分钟。

如何查看MySQL当前连接数和最大连接限制_max_connections并动态调整?

直接连接MySQL并执行以下命令即可,无需猜测、无需配置文件:

  • SHOW VARIABLES LIKE 'max_connections'; —— 看服务端允许的最大并发连接数(比如返回 151500
  • 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,却把 MySQL max_connections 拉到 1000,纯属浪费

真正卡住的往往不是上限数字,而是连接泄漏(应用没 close)、长事务阻塞、或 DNS 解析失败导致认证连接堆积——这些得靠 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60; 和慢日志一起排查,不是改个 max_connections 就能绕过去的。

标签:Mysql

本文共计869个文字,预计阅读时间需要4分钟。

如何查看MySQL当前连接数和最大连接限制_max_connections并动态调整?

直接连接MySQL并执行以下命令即可,无需猜测、无需配置文件:

  • SHOW VARIABLES LIKE 'max_connections'; —— 看服务端允许的最大并发连接数(比如返回 151500
  • 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,却把 MySQL max_connections 拉到 1000,纯属浪费

真正卡住的往往不是上限数字,而是连接泄漏(应用没 close)、长事务阻塞、或 DNS 解析失败导致认证连接堆积——这些得靠 SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 60; 和慢日志一起排查,不是改个 max_connections 就能绕过去的。

标签:Mysql