MAX_QUERIES_PER_HOUR限制用户每小时SQL执行总数,MAX_CONNECTIONS_PER_HOUR才限制每小时新连接次数;前者用ALTER USER设置,后者必须用GRANT USAGE配合WITH子句并FLUSH PRIVILEGES生效。

MySQL中限制用户每小时查询数用的是 MAX_QUERIES_PER_HOUR,不是连接数
很多人搜“每小时最大连接数”,但 MAX_QUERIES_PER_HOUR 管的是语句执行次数,不是连接建立次数。真正限制每小时连接数的参数是 MAX_CONNECTIONS_PER_HOUR —— 它控制的是该用户一小时内最多能发起多少次 CONNECT(即成功登录),和后续执行多少条 SELECT、INSERT 无关。
如何为现有用户设置 MAX_CONNECTIONS_PER_HOUR
必须用 GRANT 语句重置权限(即使只改资源限制),不能用 ALTER USER 直接修改(MySQL 5.7 不支持,8.0+ 虽支持但行为不一致,建议统一用 GRANT):
GRANT USAGE ON *.* TO 'myuser'@'localhost'
WITH MAX_CONNECTIONS_PER_HOUR 60
MAX_QUERIES_PER_HOUR 120;-
USAGE表示不授予权限,只设资源限制 - 必须显式写出所有要保留的限制项,否则未列出的会重置为 0(即禁用)
- 执行后需
FLUSH PRIVILEGES(仅当直接操作mysql.user表时才强制需要;用GRANT通常自动刷新)
为什么 SET PASSWORD 或 ALTER USER 配了没生效
常见错误是误以为以下写法有效:
ALTER USER 'myuser'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 30;
这在 MySQL 8.0.12+ 才被支持,且有严格前提:
- 必须已存在该用户(
CREATE USER先执行) - 不能和
GRANT混用:如果之前用GRANT设过限制,再用ALTER USER可能被忽略或覆盖不全 -
MAX_CONNECTIONS_PER_HOUR影响的是新连接建立频率,不是当前连接存活时间 —— 用户连上后可一直保持连接,只要一小时内不再新建连接即可
验证限制是否生效及调试技巧
查用户当前限制:
SELECT User, Host, max_connections_per_hour, max_questions_per_hour FROM mysql.user WHERE User = 'myuser';
注意:
- 字段名是
max_connections_per_hour(下划线,小写),不是大写的MAX_... - 值为
0表示不限制;负值非法,会被当作 0 处理 - 测试时别用同一连接反复执行
SELECT—— 这触发的是MAX_QUERIES_PER_HOUR,不是连接限制;要开多个终端或脚本循环mysql -u myuser -e "SELECT 1"才能触发连接频控
真正容易被忽略的是:这些限制只对普通用户生效,root 或拥有 CONNECTION_ADMIN 权限的用户不受影响;且限制统计基于服务端时间,不按自然小时滚动,而是从第一次连接开始计时 3600 秒窗口。


















