Spec-Zone .ru
спецификации, руководства, описания, API

6.3.4. Устанавливание Пределов Ресурса Учетной записи

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

В MySQL 5.7 можно ограничить использование следующих ресурсов сервера для отдельных учетных записей:

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

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

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

Чтобы установить пределы ресурса для учетной записи, используйте GRANT оператор (см. Раздел 13.7.1.4,"GRANT Синтаксис"). Обеспечьте a WITH пункт, который называет каждый ресурс, который будет ограничен. Значение по умолчанию для каждого предела является нулем (никакой предел). Например, чтобы создать новую учетную запись, которая может получить доступ customer база данных, но только ограниченным способом, делает эти заявления:

mysql> CREATE USER 'francis'@'localhost' IDENTIFIED
        BY 'frank';mysql> GRANT ALL ON customer.* TO
        'francis'@'localhost'    ->  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 также нуль, нет никакого предела для учетной записи.

Чтобы изменить существующие пределы для учетной записи, используйте a GRANT USAGE оператор на глобальном уровне (ON *.*). Следующий оператор изменяет предел запроса для francis к 100:

mysql> GRANT USAGE ON *.* TO
        'francis'@'localhost'    ->     WITH MAX_QUERIES_PER_HOUR
        100;

Оператор изменяет только определенное предельное значение и уходит со счета, иначе неизменного.

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

mysql> GRANT USAGE ON *.* TO
        'francis'@'localhost'    ->     WITH MAX_CONNECTIONS_PER_HOUR
        0;

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

GRANT ... TO 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0;GRANT ... TO 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5;GRANT ... TO '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.2, "Полномочие Систем Грант Тэбльз".)

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

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

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

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

Сбросы счетчика не влияют MAX_USER_CONNECTIONS предел.

Все количества начинаются в нуле, когда сервер запускается; количества не переносятся через перезапуск.

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