Предел "max_questions" не соблюдается при выполнении запроса MySQL через PHP - PullRequest
1 голос
/ 09 февраля 2011

Я использую MySQL Community Server 5.5 с PHP 5.3.3 на платформе Windows Server 2008. Я установил для каждого пользователя ограничения ресурсов, в частности, ограничения, связанные с запросами, выполняемыми пользователем БД в течение одного часа. Я прочитал этот документ, и он очень интересный, но всегда он не работает для меня.

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

Когда я запускаю запрос с помощью инструмента командной строки mysql (mysql.exe), лимит работает правильно, и если лимит запросов в час составлял 7, после 7 запросов в течение одного часа я получаю сообщение об ошибке:

ОШИБКА 1226 (42000): пользователь «пользователь» имеет превышен ресурс max_questions (текущее значение: 7)

Это приведенное выше желаемое поведение.

Когда я запускаю запрос через PHP (пользователь, которого я использовал для подключения к БД, тот же, что и выше), ограничение количества запросов не работает: один и тот же пользователь через php может выполнять все запросы, которые ему нужны, и без каких-либо предел. И если я вернусь в командной строке mysql над счетчиком, то он сбрасывается (даже если время не истекло): я могу выполнить 7 запросов в течение часа. Я думаю, что это не желаемое поведение. Похоже, что PHP сбрасывает счетчик и не запускает ограничение количества запросов.

PS: «Пользователь» владеет только привилегиями SELECT,INSERT,UPDATE,DELETE, а в коде PHP отсутствует код SQL, такой как FLUSH USER_RESOURCES, который не мог бы запустить пользователь «пользователь» (потому что RELOAD привилегия отсутствует) назначено пользователю)

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 16 апреля 2012

Проверьте этот совет,

сколько пользователей у вас в mysql с таким же именем ... (помните, что в mysql указывается не только имя, но и узел, к которому разрешено подключать пользователя).** ОЧЕНЬ ВАЖНО.

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

каждый из нихне то же самое, если у вас есть какое-либо правило ограничения, которое вы хотели бы использовать, поэтому вы должны назначить ограничения пользователю @ везде, где вы хотите ограничение.(все они, если у вас есть проблемы **, подумайте, что это ваш случай).

Рекомендация: создайте определенного пользователя для WEB PHP (должен быть создан только один пользователь @ хост), вместо этого используйте универсального пользователя сназначено несколько пользователей @ хостов.как phpuser @ 'localhost' обычно достаточно.

0 голосов
/ 09 февраля 2011

Я решил (частично) проблему.

Проблема возникает, только если запрос, включающий компонент 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.

0 голосов
/ 09 февраля 2011

Я думаю, что вы делаете небольшую ошибку,

Пожалуйста, проверьте хост в вашей функции mysql_connect на php. если ваш хост имеет IP-адрес, вам нужно назначить лимит ресурсов для имени пользователя @ yourip или имени пользователя @%

Если вы работаете через командную строку, то вы входите в систему с именем пользователя @ localhost и назначаете лимит тому же пользователю.

Пожалуйста, попробуйте мои вышеперечисленные приемы и дайте мне знать, если у вас все еще проблемы?

Удачного кодирования ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...