alter user生效需user@host完全匹配且带with关键字,验证须查mysql.user表max_user_connections字段;限制仅阻新连,不杀旧连,连接池配置超限必报错1226。

ALTER USER没生效?检查Host匹配和语法细节
直接执行SET GLOBAL max_user_connections = 5对已有用户完全无效,它只影响后续新创建用户的默认值。真正起作用的必须是ALTER USER语句,且要求User@Host字段与SHOW GRANTS FOR 'user'@'host'输出**逐字一致**。
- 如果账号是
'app'@'192.168.1.100',写成'app'@'%'或'app'@'localhost'都算不同账号,不会修改原限制 - 语法中
WITH关键字不可省略:ALTER USER 'app'@'%' WITH MAX_USER_CONNECTIONS 5 - MySQL 5.7.6+ 不需要
FLUSH PRIVILEGES,但改完必须查表验证,不能只信命令返回“OK”
验证是否真生效?别信SHOW VARIABLES,查mysql.user表
唯一可信的验证方式是直接读取权限表:SELECT User, Host, max_user_connections FROM mysql.user WHERE User = 'app';。注意字段名是全小写max_user_connections,不是MAX_USER_CONNECTIONS或驼峰命名。
- 如果该字段为
NULL,说明限制未设置(等同于无限制) - 如果值为
0,表示明确禁止该用户建立任何连接 - 实测触发:用多个终端并发执行
mysql -u app -p -e "SELECT 1;",第N+1次应报错ERROR 1226 (42000): User 'app' has exceeded the 'max_user_connections' resource (current value: 5)
连接池配得比用户限制还高?应用必炸
哪怕数据库侧设了MAX_USER_CONNECTIONS 5,如果HikariCP的maximumPoolSize或Druid的maxActive设为10,应用启动时就会反复报ERROR 1226,连接池不会自动降级或重试。
- 多个微服务共用同一账号(如
'app'@'%')时,所有实例的连接数会叠加突破上限——建议按部署单元拆分账号,例如'app_web1'@'10.0.1.10'、'app_web2'@'10.0.1.11' - 空闲连接未释放也会卡满配额:检查应用是否漏调
close(),同时确认wait_timeout和连接池的idleTimeout是否合理(比如设为60秒,而非8小时)
为什么SHOW PROCESSLIST里连接数远超限制?
因为max_user_connections只限制**新连接建立**,不终止已有连接。如果你先建了10个连接,再把限制设为5,已存在的10个连接仍可继续工作,只是第11个连接会被拒绝。
- 查实时活跃连接要用
performance_schema.threads表:SELECT user, COUNT(*) FROM performance_schema.threads WHERE TYPE = 'FOREGROUND' AND user = 'app'; -
information_schema.PROCESSLIST里的Sleep状态连接也会计入限制总数,只要它们还没被wait_timeout踢掉 - 重启MySQL或
KILL掉多余连接后,限制才会严格体现——这正是容易被忽略的“延迟生效”点











