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:
0 1 2 3 4 5 6 |
mysql> GRANT ALL ON klient1.* TO 'klient1'@'localhost' IDENTIFIED BY 'passklient1' WITH MAX_QUERIES_PER_HOUR 100 MAX_UPDATES_PER_HOUR 100 MAX_CONNECTIONS_PER_HOUR 10; |
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.
0 1 2 3 |
mysql> GRANT USAGE ON *.* TO 'klient1'@'localhost' WITH MAX_QUERIES_PER_HOUR 100; |
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:
0 1 2 3 4 |
mysql> GRANT <em> ALL ON klient1.* TO 'klient1'@'localhost' IDENTIFIED BY 'passklient1' WITH MAX_USER_CONNECTIONS 10;</em> |