mysql不支持限制单个用户的查询并发数,仅能通过alter user设置max_user_connections限制其最大连接数;set global max_user_connections对已有用户无效,仅为新用户设默认值;验证须查mysql.user表并实测触发error 1226。

MySQL 本身不支持限制单个用户的查询并发数(即同时执行的 SQL 语句数量),只支持限制其最大连接数;所谓“查询并发”需由应用层或中间件控制,数据库侧唯一可配的是 MAX_USER_CONNECTIONS。
用 ALTER USER 设置用户最大连接数(MySQL 5.7.6+)
这是生产环境最常用、最可靠的方式,对已有用户立即生效,且无需重启或 FLUSH PRIVILEGES:
-
ALTER USER必须带WITH关键字,例如:ALTER USER 'app_user'@'%' WITH MAX_USER_CONNECTIONS 5; - 主机名部分(
@后)必须和SHOW GRANTS FOR 'app_user'@'%'输出完全一致;'app_user'@'localhost'和'app_user'@'127.0.0.1'是两个独立账号 - 设为
0表示不限制(默认值),不是“禁止登录” - 该限制只校验新建连接,已建立的连接不受影响,也不会被主动断开
为什么 SET GLOBAL max_user_connections 不起作用?
这条命令只影响后续新创建用户的默认值,对任何已有用户都完全无效。执行后查 mysql.user 表,目标用户的 max_user_connections 字段仍是 NULL 或旧值:
- 误用它会导致压测或流量高峰时突然触发
ERROR 1226,但你根本没配成功 - 它不是“全局开关”,而是“新用户模板”,线上配置切勿依赖它
- 真正起效的只有写入
mysql.user表的账户级元数据,即通过CREATE USER或ALTER USER设置
验证配置是否真生效:查表 + 实测超限
不能只看命令是否执行成功,必须交叉验证:
- 查配置:
SELECT User, Host, max_user_connections FROM mysql.user WHERE User = 'app_user';—— 注意字段名是全小写max_user_connections,不是驼峰或大写 - 查实时活跃连接(需开启
performance_schema):SELECT user, COUNT(*) FROM performance_schema.threads WHERE TYPE = 'FOREGROUND' AND user = 'app_user' GROUP BY user; - 实测触发:用多个终端并行执行
mysql -u app_user -p -e "SELECT 1;",第N+1次(N是你设的上限)应明确报错:ERROR 1226 (42000): User 'app_user' has exceeded the 'max_user_connections' resource limit
连接池配置必须 ≤ 用户连接限制值
这是最容易被忽略的落地环节:
- HikariCP 的
maximumPoolSize、Druid 的maxActive等参数,必须 ≤ 对应账号的MAX_USER_CONNECTIONS值 - 否则应用启动或首次压测就会反复报
ERROR 1226,连接池不会自动降级或重试 - 多个微服务共用同一账号(如
'app'@'%')时,总连接数会叠加突破限制——建议按服务实例拆分账号,例如'app_web1'@'10.0.1.10'
MySQL 没有类似 PostgreSQL 的 CONNECTION LIMIT 或查询级并发控制机制;所有“查询并发”类需求,必须在应用代码、连接池、API 网关或数据库代理层实现,数据库本身只管连接准入这一层。











