<p>phpMyAdmin 不提供 MAX_CONNECTIONS_PER_HOUR 设置入口,必须用 GRANT USAGE ON . TO 'user'@'host' WITH MAX_CONNECTIONS_PER_HOUR N 配合 FLUSH PRIVILEGES 设置,该限制统计每小时新连接次数,仅 MySQL 5.6.3+ 支持且需主机名完全匹配。</p>
phpMyAdmin 本身不提供 MAX_CONNECTIONS_PER_HOUR 设置入口
你无法在 phpmyadmin 的「用户账户」界面里找到“每小时最大连接数”输入框——这个字段根本不会显示,也不支持编辑。phpmyadmin 只读取 mysql.user 表的部分字段(如 user、host、authentication_string),而 max_connections(对应 max_connections_per_hour)默认被 ui 隐藏,且没有表单供修改。
试图在 config.inc.php 中添加类似 $cfg['MaxConnectionsPerHour'] 的配置 → 无效,该变量不存在;在「编辑用户」页面勾选/填写任意新字段 → 不生效,phpMyAdmin 不提交该值到数据库。
必须用 GRANT USAGE 配合 WITH 子句设置
MAX_CONNECTIONS_PER_HOUR 是 MySQL 用户级资源限制,只能通过 SQL 命令设置,且**必须使用 GRANT USAGE 语法**,不能用 ALTER USER 或 CREATE USER ... WITH(后者不支持该参数)。
- 对已有用户执行(例如限制
'appuser'@'localhost'每小时最多 120 次新连接):GRANT USAGE ON *.* TO 'appuser'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 120;
- 执行后必须显式刷新权限:
FLUSH PRIVILEGES;
- 主机名(
Host)必须完全匹配,'appuser'@'%'和'appuser'@'192.168.1.%'是不同账号,限制互不影响 - 设为
0表示不限制;留空或省略该参数则保持原值(通常是 0)
验证是否生效 & 常见失效原因
执行后查表确认:
SELECT User, Host, max_connections FROM mysql.user WHERE User = 'appuser';结果中
max_connections 字段应为设定值(注意不是 max_user_connections)。
但即使查到了,也可能不生效,常见原因包括:
立即学习“PHP免费学习笔记(深入)”;
- 应用用了连接池(如 HikariCP、Druid)——
MAX_CONNECTIONS_PER_HOUR统计的是成功认证的 **新连接次数**,连接复用不会触发计数,实际连接数可能远低于阈值 - MySQL 版本低于 5.6.3 —— 该参数从 5.6.3 开始完整支持,5.5 及更早版本会静默忽略
- 用户通过代理(如 ProxySQL)连接,代理以固定账号连 MySQL,真实客户端身份未透传,MySQL 实际看到的是代理账号
- 拼写错误:写成
MAX_CONNECTION_PER_HOUR(少 s)或MAX_CONNS_PER_HOUR→ 语法报错或静默失败
它和 MAX_USER_CONNECTIONS、MAX_QUERIES_PER_HOUR 的区别
三者独立计数,任一超限即拒绝操作,没有优先级或降级逻辑:
-
MAX_CONNECTIONS_PER_HOUR:只统计「新建立连接」动作(mysql_real_connect()成功调用),适合防连接风暴 -
MAX_USER_CONNECTIONS:控制该用户**同时存活的最大连接数**,超了直接拒绝新连接(无论时间窗口) -
MAX_QUERIES_PER_HOUR:统计该用户账号在任意连续 60 分钟内执行的所有语句总数(SELECT、INSERT等),超限报ERROR 1226
真正难调试的是时间窗口:MySQL 的「每小时」是从服务端整点开始滚动重置(如 14:00–14:59),不是滑动窗口,监控时得对齐 MySQL 服务器时间,而不是本地时间。



















