我在Windows Server 2008平台上使用MySQL社区服务器5.5和PHP 5.3.3。 我已经设置了每个用户资源限制,特别是与数据库用户在一小时内运行的查询相关的限制。我已经阅读了这份文件,它非常有趣但总是对我不起作用。
http://dev.mysql.com/doc/refman/5.5/en/user-resources.html
当我通过mysql命令行工具(mysql.exe)运行查询时,限制正常工作,如果每小时的查询限制为7,则在一小时内发出7次查询后,我收到错误:
ERROR 1226(42000):用户'用户'有 超出了'max_questions'资源 (现值:7)
以上是想要的行为。
当我通过PHP运行查询时(我以前连接到数据库的用户是相同的),查询限制不起作用:通过php的同一个用户可以运行它想要的所有查询而没有任何查询限制。如果我回到上面的mysql命令行,计数器似乎被重置(即使小时尚未过去):我也可以在一小时内运行7个查询。 我认为这不是通缉行为。似乎PHP重置计数器并且不会触发查询限制。
PS:'用户'只拥有SELECT,INSERT,UPDATE,DELETE
个权限,而在PHP代码中,没有任何用户“用户”无法运行的FLUSH USER_RESOURCES
SQL代码(因为{{ 1}}权限未分配给用户)
提前致谢
答案 0 :(得分:1)
检查此提示,
你的mysql中有多少用户使用相同的名称..(不仅要记住名称,还要记住在mysql中指定用于连接用户的主机)。 **非常重要。
用户@%
user@127.0.0.1
用户@本地
user@172.35.20.12
如果您有任何限制规则,那么它们中的每一个都不相同,因此,您必须在任何您想要限制的地方为用户@分配限制。 (所有这些,如果你有问题**认为是你的情况)。
Recomendation:为WEB PHP创建一个特定用户(只能创建一个user @ host),而不是使用可能有多个user @host分配的通用用户。 像phpuser @'localhost'通常就足够了。
答案 1 :(得分:0)
我认为你没有做错,
请检查你的mysql_connect函数中的主机到php。 如果您的主机是IP地址,则需要将资源限制分配给用户名@ yourip或用户名@%
如果您正在通过命令行运行,那么您将从username @ localhost登录,并且您已将限制分配给同一用户。
请尝试我的上述技巧并告诉我你是否还有问题?
快乐的编码......
答案 2 :(得分:0)
我已经解决了(部分)问题。
仅当包含MAX_QUERIES_PER_HOUR组件的查询还包含以下与0不同的元素之一时,才会出现此问题:
MAX_CONNECTIONS_PER_HOUR !=0
MAX_USER_CONNECTIONS !=0;
e.g。以下授权查询不会导致与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页面运行查询时发生。