Spec-Zone.ru › MySQL 5.7

6.2.16 Установка ограничений на ресурсы учетной записи

Один из способов ограничения использования клиентом ресурсов сервера MySQL — установить глобальную системную переменную max_user_connections в ненулевое значение. Это ограничит количество одновременных подключений, которые может установить любая учетная запись, но не наложит ограничений на то, что клиент может делать после подключения. Кроме того, установка max_user_connections не включает управление отдельными учетными записями. Оба типа контроля представляют интерес для администраторов MySQL.

Для решения таких проблем MySQL позволяет устанавливать ограничения для отдельных учетных записей на использование этих ресурсов сервера:

  • Количество запросов, которое может выполнить учетная запись в час

  • Количество обновлений, которое может выполнить учетная запись в час

  • Количество подключений учетной записи к серверу в час

  • Количество одновременных подключений к серверу учетной записью

Любое утверждение, которое может выполнить клиент, учитывается в лимите запросов, если его результаты не получены из кэша запросов. Только утверждения, которые изменяют базы данных или таблицы, учитываются в лимите обновлений.

«Учетная запись» в данном контексте соответствует строке в таблице системы mysql.user. То есть подключение оценивается по значениям User и Host в строке таблицы user, которая применяется к подключению. Например, учетная запись 'usera'@'%.example.com' соответствует строке в таблице user, которая имеет значения User и Host равные usera и %.example.com, чтобы позволить usera подключаться с любого хоста в домене example.com. В этом случае сервер применяет ограничения на ресурсы в этой строке ко всем подключениям usera с любого хоста в домене example.com, так как все такие подключения используют одну и ту же учетную запись.

До MySQL 5.0 учетная запись оценивалась по фактическому хосту, с которого пользователь подключается. Этот более старый метод учета может быть выбран при запуске сервера с параметром --old-style-user-limits. В этом случае, если usera подключается одновременно с host1.example.com и host2.example.com, сервер применяет ограничения на ресурсы учетной записи отдельно к каждому подключению. Если usera подключается снова с host1.example.com, сервер применяет ограничения для этого подключения вместе с существующим подключением с этого хоста.

Чтобы установить ограничения на ресурсы для учетной записи во время создания учетной записи, используйте оператор CREATE USER. Чтобы изменить ограничения для существующей учетной записи, используйте ALTER USER. Укажите клаузу WITH, которая называет каждый ресурс, который должен быть ограничен. Значение по умолчанию для каждого ограничения равно нулю (без ограничения). Например, чтобы создать новую учетную запись, которая может получить доступ к базе данных customer, но только ограниченным образом, выполните следующие операторы:

mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank'
    ->     WITH MAX_QUERIES_PER_HOUR 20
    ->          MAX_UPDATES_PER_HOUR 10
    ->          MAX_CONNECTIONS_PER_HOUR 5
    ->          MAX_USER_CONNECTIONS 2;

Типы ограничений необязательно должны быть названы в клаузе WITH, но указанные могут быть в любом порядке. Значение каждого ограничения в час должно быть целым числом, представляющим счет в час. Для MAX_USER_CONNECTIONS ограничение — это целое число, представляющее максимальное количество одновременных подключений учетной записи. Если это ограничение установлено в ноль, значение глобальной системной переменной max_user_connections определяет количество одновременных подключений. Если max_user_connections также равно нулю, для учетной записи ограничений нет.

Чтобы изменить ограничения для существующей учетной записи, используйте оператор ALTER USER. Следующий оператор изменяет ограничение запросов для francis на 100:

mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;

Оператор изменяет только значение указанного ограничения и оставляет учетную запись в остальном неизменной.

Чтобы удалить ограничение, установите его значение в ноль. Например, чтобы удалить ограничение на количество подключений в час для francis, используйте этот оператор:

mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;

Как упоминалось ранее, ограничение одновременных подключений для учетной записи определяется из ограничения MAX_USER_CONNECTIONS и системной переменной max_user_connections. Предположим, что значение глобальной переменной max_user_connections равно 10, а у трех учетных записей заданы индивидуальные ограничения на ресурсы следующим образом:

ALTER USER 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0;
ALTER USER 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5;
ALTER USER 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20;

user1 имеет ограничение на подключения 10 (значение глобальной переменной max_user_connections), так как у него ограничение MAX_USER_CONNECTIONS равно нулю. user2 и user3 имеют ограничения на подключения 5 и 20 соответственно, потому что у них есть ненулевые ограничения MAX_USER_CONNECTIONS.

Сервер хранит ограничения на ресурсы для учетной записи в строке таблицы user, соответствующей учетной записи. Столбцы max_questions, max_updates и max_connections хранят ограничения на использование в час, а столбец max_user_connections хранит ограничение MAX_USER_CONNECTIONS. (См. Раздел 6.2.3, «Таблицы разрешений».)

Подсчет использования ресурсов происходит, когда у любой учетной записи установлено ненулевое ограничение на использование любого из ресурсов.

По мере работы сервера он подсчитывает количество раз, когда каждая учетная запись использует ресурсы. Если учетная запись достигает своего лимита подключений в течение последнего часа, сервер отклоняет дальнейшие подключения для этой учетной записи до тех пор, пока не закончится этот час. Аналогично, если учетная запись достигает своего лимита на количество запросов или обновлений, сервер отклоняет дальнейшие запросы или обновления до тех пор, пока не закончится час. Во всех таких случаях сервер выдает соответствующие сообщения об ошибках.

Подсчет ресурсов происходит по каждой учетной записи, а не по каждому клиенту. Например, если ваша учетная запись имеет лимит на запросы 50, вы не можете увеличить свой лимит до 100, создав два одновременных клиентских подключения к серверу. Запросы, выданные на обоих подключениях, суммируются.

Текущие счетчики использования ресурсов за час можно сбросить глобально для всех учетных записей или индивидуально для данной учетной записи:

  • Чтобы сбросить текущие счетчики в ноль для всех учетных записей, выполните оператор FLUSH USER_RESOURCES. Счетчики также можно сбросить, перезагрузив таблицы разрешений (например, с помощью оператора FLUSH PRIVILEGES или команды mysqladmin reload).

  • Счетчики для отдельной учетной записи могут быть сброшены в ноль, повторно установив любое из ее ограничений. Укажите значение ограничения, равное текущему значению, присвоенному учетной записи.

Сброс счетчиков за час не влияет на ограничение MAX_USER_CONNECTIONS.

Все счетчики начинаются с нуля при запуске сервера. Счетчики не переносятся через перезапуск сервера.

Для ограничения MAX_USER_CONNECTIONS может возникнуть особый случай, если у учетной записи открыто максимальное количество разрешенных ей подключений: отключение, за которым быстро следует подключение, может привести к ошибке (или ), если сервер не полностью обработает отключение к моменту подключения. Когда сервер завершит обработку отключения, еще одно подключение снова будет разрешено.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/user-resources.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API