Spec-Zone .ru
спецификации, руководства, описания, API
|
Одно средство ограничения использования ресурсов сервера 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, делая два одновременных клиентских соединения с сервером. Запросы, выпущенные на обоих соединениях, считаются вместе.
Ток начасовой количества использования ресурса может быть сброшен глобально для всех учетных записей, или индивидуально для сделанного отчета:
Сбрасывать текущие количества, чтобы обнулить для всех учетных записей, проблемы a
FLUSH
USER_RESOURCES
оператор. Количества также могут быть сброшены, перезагружая таблицы
предоставления (например, с a FLUSH
PRIVILEGES
оператор или mysqladmin перезагружают команду).
Счета для отдельной учетной записи могут быть обнулены, повторно предоставляя это
любой из ее пределов. Чтобы сделать это, использовать GRANT USAGE
как описано ранее и определяют предельное значение,
равное значению, которое в настоящий момент имеет учетная запись.
Сбросы счетчика не влияют MAX_USER_CONNECTIONS
предел.
Все количества начинаются в нуле, когда сервер запускается; количества не переносятся через перезапуск.
Для MAX_USER_CONNECTIONS
предел, граничный случай может произойти, если учетная
запись в настоящий момент имеет открытый максимальное количество соединений, разрешенных к этому: разъединение,
сопровождаемое быстро соединением, может привести к ошибке (ER_TOO_MANY_USER_CONNECTIONS
или ER_USER_LIMIT_REACHED
) если сервер не полностью обработал разъединение к тому
времени, когда соединение происходит. Когда обработка разъединения концов сервера, другое соединение будет еще
раз разрешено.