mysql 8.0+ 用 max_user_connections 限制用户并发连接数,建用户时用 create user ... with max_user_connections n,已有用户用 alter user ... with max_user_connections n;设为0表示不限,该限制仅对指定用户生效,且只在新建连接时校验,已建立连接不受影响。

MySQL 8.0+ 怎么给用户设最大连接数
直接改 CREATE USER 或 ALTER USER 的 MAX_CONNECTIONS_PER_HOUR 不起作用——那是限制每小时新建连接次数,不是并发连接上限。真正管“同时能连几个”的是 MAX_USER_CONNECTIONS。
实操建议:
- 建用户时直接指定:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' WITH MAX_USER_CONNECTIONS 10; - 已有用户用:
ALTER USER 'app'@'%' WITH MAX_USER_CONNECTIONS 10; - 设为 0 表示不限(默认值),不是“禁止连接”
- 该限制只对这个用户生效,不继承全局
max_connections值
为什么 SHOW PROCESSLIST 看到的连接数还是超了
常见错误现象:设了 MAX_USER_CONNECTIONS 5,但 SHOW PROCESSLIST 里看到这个用户有 8 个活跃连接。
原因和应对:
- MySQL 只在新建连接时检查限制,已建立的连接不会被踢出或拒绝,所以旧连接堆积会导致“看起来超限”
- 应用没正确关闭连接(比如没调
close()、没用连接池回收机制),会持续占着名额 - 连接空闲但未断开(如 wait_timeout 未触发),也会卡在连接池里算作“已用”
- 验证是否真生效:用新连接反复测试,别只看历史连接列表
MySQL 5.7 怎么兼容处理
5.7 不支持 WITH MAX_USER_CONNECTIONS 语法,得靠 GRANT 指令间接设置。
注意点:
- 必须用
GRANT USAGE ON *.* TO 'user'@'host' WITH MAX_USER_CONNECTIONS 10; - 不能单独执行
GRANT,必须带上USAGE权限(它本身不授任何操作权,纯配额) - 执行后要
FLUSH PRIVILEGES;,否则不生效 - 如果用户已有其他权限,
GRANT USAGE不会覆盖,但配额会更新
连接数限制和应用报错的关系
当用户超出 MAX_USER_CONNECTIONS,新连接会直接失败,错误信息是:Too many connections for user 'xxx'(MySQL 8.0.19+)或更早版本的 User xxx has exceeded the max_user_connections resource (current value: N)。
容易被忽略的地方:
- 这个错误和全局
max_connections超限的报错不同,后者是Too many connections(没提 user) - ORM 或连接池(如 HikariCP、Druid)可能把这类错误吞掉或转成 generic timeout,得查 MySQL 错误日志确认
- 连接池配置里的
maximumPoolSize必须 ≤ 用户的MAX_USER_CONNECTIONS,否则必炸
复杂点在于:限制生效时机只在 connect 阶段,而连接生命周期、空闲回收、异常中断这些都由应用层控制——数据库只管“放行”或“拒之门外”,不管“你连上了赖着不走”。











