Limitowanie zasobów użytkowników w MySQL

Tworząc konto w systemie jesteśmy wstanie ograniczyć użytkownika prawie z każdej strony. Często osoby pytają mnie  jak zrobić limitowanie w MySQL-u?

W poszczególnych wersjach MySQL-a zakres ograniczeń wygląda następująco.

Wersje starsze niż 4.0.2:

Jedyne ograniczenie poprzez ustawienie zmiennej systemowej max_user_connections na wartość większą od zera. Jednak parametr ten ma charakter globalny i dotyczy wszystkich użytkowników, co nie pozwala na limitowanie poszczególnego konta.

Wersje od 4.0.2 do 5.0.3:

Tutaj mamy możliwość ograniczeń na poniżej wymienione zasoby:

  • liczbę zapytań (select) na godzinę [MAX_QUERIES_PER_HOUR] ,
  • liczbę aktualizacji (delete,update,insert) na godzinę [MAX_UPDATES_PER_HOUR],
  • liczbę połączeń z serwerem na godzinę [MAX_CONNECTIONS_PER_HOUR].

Każda instrukcja wydana przez klienta jest zliczana do limitu zapytań. Do limitu aktualizacji liczą sie tylko te, które modyfikują bazy danych lub tabele.

Konto jest definiowane unikalne jako para wartości w kolumnach HOST i USER.

Aby dane konto ograniczyć należy użyć instrukcji GRANT z klauzulą WITH, poniżej przedstawiam przykład użycia:

W tym przykładzie użytkownik ma zdefiniowane wszystkie możliwe ograniczenia, jednak zawsze możemy ograniczyć tylko jeden parametr wymieniając go w klauzuli WITH a pomijając pozostałe.

Serwer zlicza, ile razy każde z kont skorzystało z zasobów. Jeśli limity dla danego konta się wyczerpią, następne połączenia będą odrzucane, dopóki nie minie ta godzina. W przypadku odrzucenia połączenia, zwracany jest odpowiedni komunikat o błędzie.

Zliczanie odbywa się według konta, a nie podłączonego klienta, tj. mając limit 100 zapytań, to nie podwoimy go nawiązując dwa jednoczesne połączenia. Zapytania przysyłane przez oba połączenia są zliczane wspólnie.

Zerowanie liczników możemy przeprowadzić na dwa sposoby:

1. globalnie poprzez wydanie komendy:

mysql> FLUSH USER_RESOURCES;

lub

mysql> FLUSH PRIVILEGES;

2. dla poszczególnego konta, za pomocą GRANT USAGE podając limit równy istniejącej wartości.

Od wersji MySQL 5.0.3:

Dodatkowo możemy ograniczyć ilość jednocześnie nawiązanych połączeń do bazy per konto.

Takie ograniczenie definiujemy za pomocą poniższej komendy: