mysql通过create/alter user语句中的max_updates_per_hour子句限制用户每小时update语句数,仅对非super用户生效,按自然小时滚动统计,0表示禁止,正整数为上限,设为null或省略无效。
phpmyadmin 本身不能限制用户每小时更新次数,真正起作用的是 mysql 的 max_updates_per_hour 账户资源限制,必须通过 create user 或 alter user 设置,且仅对非 super 权限用户生效。
MySQL 原生限制只在创建/修改用户时生效
这个限制不是配置项,而是用户定义语法的一部分,运行时无法动态开启或调整。设了才生效,不设就默认无限制。
- 新建用户时直接绑定:
CREATE USER 'api_user'@'%' IDENTIFIED BY 'pwd' WITH MAX_UPDATES_PER_HOUR 120; - 已有用户修改:
ALTER USER 'api_user'@'%' WITH MAX_UPDATES_PER_HOUR 60; - 取消限制必须显式设为 0:
ALTER USER 'api_user'@'%' WITH MAX_UPDATES_PER_HOUR 0;(设为NULL或省略无效)
为什么设置了却没拦住 UPDATE?
常见失效不是语法错,而是执行环境和认知偏差:
-
SUPER权限用户完全绕过所有资源限制,用SHOW GRANTS FOR 'user'@'host';确认权限 - 连接池(如 HikariCP)下多个连接共用同一用户身份,限制按用户维度汇总计数,不是单连接独立算
- 计时窗口是自然小时(如 14:00–15:00),不是从第一次 UPDATE 开始滚动;超限后立刻报错
ERROR 1226 (42000): User 'xxx' has exceeded the 'max_updates_per_hour' resource - 注意拼写:
MAX_UPDATE_PER_HOUR(少 s)或MAX_UPDATES_PER_HOUR(旧别名)会导致静默忽略或语法错误
phpMyAdmin 里怎么操作?
它只是个界面代理,所有设置最终都得走 SQL。你可以在 phpMyAdmin 的「SQL」标签页里粘贴执行语句:
- 不要试图在「用户账户」界面里找“每小时更新上限”选项——根本没有
- 执行完
ALTER USER后,用SELECT user, host, max_updates_per_hour FROM mysql.user WHERE user = 'xxx';确认字段已更新 - 验证是否生效:用目标用户反复执行
UPDATE t SET x=1 LIMIT 1;,直到触发ERROR 1226
最容易被忽略的点是:这个限制统计的是「UPDATE 语句条数」,不是影响行数;一条 UPDATE ... WHERE id IN (1,2,3,4,5) 算 1 次,不是 5 次。如果业务里大量批量更新,很容易在几分钟内耗尽额度。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











