Spec-Zone.ru › MySQL 9.2

8.2.21 Установка лимитов ресурсов для учетной записи

Один из способов ограничить использование клиентом ресурсов сервера 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, так как все такие подключения используют одну и ту же учетную запись.

Для установки ограничений ресурсов для учетной записи во время создания учетной записи используйте оператор 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. (См. Раздел 8.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-8.4-en/user-resources.html

Spec-Zone.ru

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