max_connections_per_hour 是mysql中针对用户的每小时连接数限制,仅统计成功认证的新连接,需用grant usage配合with子句设置,生效需flush privileges;它与max_user_connections(并发连接上限)和全局max_connections(实例总连接数)互不干扰。

MySQL 中 MAX_CONNECTIONS_PER_HOUR 是什么
它不是全局配置项,而是针对具体用户的资源限制策略,作用是在账户级别控制该用户每小时最多能发起多少次新连接。注意:它只统计 CONNECT 动作(即客户端成功建立 TCP 连接并完成认证),不计算查询、空闲等待或连接复用(如连接池里的长连接重用)。
如何为已有用户设置 MAX_CONNECTIONS_PER_HOUR
必须用 GRANT 语句重新赋权(不能用 ALTER USER 直接修改该限制),且需具备 GRANT OPTION 权限:
GRANT USAGE ON *.* TO 'app_user'@'%' WITH MAX_CONNECTIONS_PER_HOUR 120;
说明:
-
USAGE表示不授予权限,仅设置资源限制 - 必须显式指定主机(如
'%'或'192.168.1.%'),不能省略 - 执行后需运行
FLUSH PRIVILEGES;才生效(MySQL 8.0.16+ 在部分场景下可自动刷新,但建议显式执行) - 若用户已存在且有其他权限,
GRANT USAGE不会覆盖原有权限,只追加限制
为什么设置了却没生效?常见原因
这个限制在以下情况不会触发拦截:
- 用户使用的是连接池(如 HikariCP、Druid),连接被复用,实际每小时
CONNECT次数远低于阈值 - MySQL 版本低于 5.6.3 —— 该限制从 5.6.3 开始完整支持;5.5 及更早版本忽略该参数
- 用户通过代理(如 ProxySQL、MaxScale)连接,而代理以固定账号连 MySQL,真实客户端 IP/账号未透传
- 错误地在
CREATE USER时写了MAX_CONNECTIONS_PER_HOUR,但没带WITH关键字(语法无效,会被静默忽略)
验证是否生效:查 mysql.user 表的 max_connections 字段(注意不是 max_user_connections):
SELECT User, Host, max_connections FROM mysql.user WHERE User = 'app_user';
和 max_user_connections、max_connections 的区别
三者完全独立,别混用:
-
max_connections(用户级):单个用户每小时新建连接上限,即MAX_CONNECTIONS_PER_HOUR -
max_user_connections(用户级):该用户**同时保持的最大活跃连接数**,超了就拒绝新连接(无论时间窗口) -
max_connections(全局变量):整个 MySQL 实例允许的最大并发连接数,由SET GLOBAL max_connections = N控制
例如:设 max_connections = 60、max_user_connections = 10,意味着该用户一小时内最多连 60 次,但任意时刻最多只能有 10 个连接活着——后者更容易成为瓶颈。
真正卡住业务的往往是 max_user_connections,而不是每小时计数,这点容易被忽略。











