直接限制单个用户的最大连接数(MAX_USER_CONNECTIONS)是最有效、最可控的防资源耗尽手段;ALTER USER修改已有用户、GRANT创建新用户时绑定该限制,需分别设置多host账户,设为0不推荐,务必验证配置生效与实时连接数。

直接限制单个用户的最大连接数,是防止恶意或异常程序耗尽 MySQL 连接资源最有效、最可控的手段。全局 max_connections 调高治标不治本,而用户级 MAX_USER_CONNECTIONS 才能精准隔离风险。
用 ALTER USER 修改已有用户的连接上限
生产环境里绝大多数情况是给已存在的账号加限制,ALTER USER 是唯一推荐方式。它立即生效,不重启,且不会误改权限。
-
ALTER USER 'dev_user'@'localhost' WITH MAX_USER_CONNECTIONS 5;—— 这条语句只改连接数,其他权限、密码、SSL 设置全保留 - 执行后无需
FLUSH PRIVILEGES,MySQL 8.0+ 的ALTER USER自动刷新权限缓存 - 如果用户有多个 host(比如
'dev_user'@'192.168.%'和'dev_user'@'localhost'),必须分别设置,它们是独立账户 - 设为
0表示不限制(退回到全局max_connections约束),但不建议线上账号留 0
建用户时就绑定 MAX_USER_CONNECTIONS
新账号务必在创建阶段就定死连接上限,避免后期疏漏。用 GRANT ... WITH MAX_USER_CONNECTIONS 是兼容性最好的写法,尤其适用于 MySQL 5.7 及更早版本。
CREATE USER 'api_user'@'%' IDENTIFIED BY 'xxx';-
GRANT SELECT, INSERT ON app.* TO 'api_user'@'%' WITH MAX_USER_CONNECTIONS 20;—— 注意:这里GRANT同时完成授权 + 限连,一步到位 - 不要用
CREATE USER ... WITH MAX_USER_CONNECTIONS 20,该语法在 MySQL 8.0.16 之前不支持,容易报错 - 如果只是想调连接数而不动权限,用
GRANT USAGE ON *.* TO 'user'@'host' WITH MAX_USER_CONNECTIONS N;
验证限制是否真正生效
很多人改完就以为万事大吉,但没验证等于没做。关键要看两个地方:配置值是否写入系统表、当前连接是否被拦截。
- 查配置:
SELECT User, Host, Max_user_connections FROM mysql.user WHERE User = 'dev_user';—— 确保返回的Max_user_connections是你设的数字,不是0或NULL - 查实时连接:
SELECT user, COUNT(*) FROM performance_schema.threads WHERE TYPE = 'FOREGROUND' AND user = 'dev_user' GROUP BY user;—— 这个 COUNT 就是当前活跃连接数,超限后新连接会直接被拒绝 - 手动测试:用该账号反复执行
mysql -u dev_user -p -e "SELECT 1;"超过设定值,第 N+1 次应报错ERROR 1226 (42000): User 'dev_user' has exceeded the 'max_user_connections' resource (current value: 5) - 注意:已建立的连接不会被踢,限制只在新建连接时检查
连接池场景下特别容易踩的坑
应用用了 HikariCP、Druid 等连接池,很容易误判连接数是否超限——因为池里的“空闲连接”也算在 MAX_USER_CONNECTIONS 里。
- 比如设了
MAX_USER_CONNECTIONS 10,但 HikariCP 配置了maximumPoolSize=20,只要池子试图扩张到第 11 条连接,就会失败 - 排查时别只看
Threads_connected,要结合information_schema.processlist看实际用户名和 command 状态(大量Sleep就是池子占着不放) - 如果应用日志频繁出现连接获取超时,先确认是不是池子配置 > 用户连接上限,而不是急着调高
max_connections - 临时应急可以设
wait_timeout和interactive_timeout缩短 Sleep 连接存活时间,但根治还得靠匹配池大小与用户限制
真正难的不是设那个数字,而是对每个业务账号评估合理并发量:API 服务、后台任务、开发直连、监控探针,它们的连接行为完全不同。一个 MAX_USER_CONNECTIONS 3 的监控账号被设成 50,可能比没设限制还危险。


















