1

我在 Windows Server 2008 平台上使用 MySQL Community Server 5.5 和 PHP 5.3.3。我已经设置了每个用户的资源限制,特别是与数据库用户在一小时内运行的查询相关的限制。我已阅读此文档,它非常有趣,但它总是对我不起作用。

http://dev.mysql.com/doc/refman/5.5/en/user-resources.html

当我通过 mysql 命令行工具 (mysql.exe) 运行查询时,限制正常工作,如果每小时查询限制为 7,则在一小时内进行 7 次查询后,我收到错误:

错误 1226 (42000):用户 'user' 已超出 'max_questions' 资源(当前值:7)

以上是想要的行为。

当我通过 PHP 运行查询时(我用来连接数据库的用户与上面相同),查询限制不起作用:同一用户通过 php 可以运行它想要的所有查询,并且没有任何限制。如果我回到计数器上方的 mysql 命令行,计数器似乎被重置(即使时间还没有过去):我也可以在一小时内运行 7 个查询。我认为这不是想要的行为。似乎 PHP 重置了计数器并且没有触发查询限制。

PS:“用户”仅拥有SELECT,INSERT,UPDATE,DELETE权限,并且在 PHP 代码中没有任何 SQL 代码,FLUSH USER_RESOURCES因为用户“用户”无法运行(因为RELOAD权限未分配给用户)

提前致谢

4

3 回答 3

1

检查这个提示,

您的 mysql 中有多少个具有相同名称的用户..(请记住,不仅名称,而且允许连接用户的主机在 mysql 中指定)。**很重要。

user@%
user@127.0.0.1
user@localhost
user@172.35.20.12

它们中的每一个都不相同,如果您有任何您喜欢使用的限制规则,那么您必须将限制分配给用户@无论您想要限制的地方。(所有这些,如果你有问题**认为是你的情况)。

建议:为 WEB PHP 创建一个特定的用户(只需要创建一个 user@host),而不是使用一个可能分配多个 users@hosts 的通用用户。像 phpuser@'localhost' 通常就足够了。

于 2012-04-15T22:28:58.720 回答
0

我认为你犯了一个小错误,

请检查您的 mysql_connect 函数中的主机到 php.ini 中。如果您的主机是 IP 地址,那么您需要将资源限制分配给 username@yourip 或 username@%

如果您通过命令行运行,那么您将从 username@localhost 登录,并且您已将限制分配给同一用户。

请尝试我的上述技巧,如果您还有问题,请告诉我?

快乐的编码......

于 2011-02-09T10:27:22.717 回答
0

我已经(部分)解决了这个问题。

仅当包含 MAX_QUERIES_PER_HOUR 组件的查询还包含以下不同于 0 的元素之一时,才会出现此问题:

MAX_CONNECTIONS_PER_HOUR !=0
MAX_USER_CONNECTIONS !=0;

例如,以下授权查询永远不会导致与 PHP 中的查询限制成就相关的错误消息:

GRANT USAGE ON *.* TO 'user'@'localhost'
WITH MAX_QUERIES_PER_HOUR 20
MAX_UPDATES_PER_HOUR 10
MAX_CONNECTIONS_PER_HOUR 5
MAX_USER_CONNECTIONS 2;

相反,以下授权正常工作,MySQL 正确应用了限制。

GRANT USAGE ON *.* TO 'user'@'localhost'
    WITH MAX_QUERIES_PER_HOUR 20
    MAX_UPDATES_PER_HOUR 10
    MAX_CONNECTIONS_PER_HOUR 0
    MAX_USER_CONNECTIONS 0;

简而言之,当查询设置查询限制包括组件之一,MAX_CONNECTIONS_PER_HOUR 和 MAX_USER_CONNECTIONS 不为 0 时,与 MAX_QUERIES_PER_HOUR 和 MAX_UPDATES_PER_HOUR 相关的限制被忽略:我的 PHP 页面可以执行他们想要的所有查询。否则,限制被理解并且消息

已超过“max_questions”资源

当查询限制成就事件发生时正确显示。

正如我上面所说,当我使用 mysql 命令行工具时,不会出现问题。它仅在通过 PHP 页面运行查询时发生。

于 2011-02-09T14:36:37.407 回答