Eine Möglichkeit, die Nutzung der MySQL-Serverressourcen
einzuschränken, besteht in der Einstellung der Systemvariablen
max_user_connections
auf einen Wert ungleich
Null. Allerdings arbeitet diese Methode streng global und
ermöglicht keine Verwaltung einzelner Konten. Außerdem wird
hierbei nur die Anzahl der Verbindungen beschränkt, die
gleichzeitig über ein einzelnes Konto verwendet werden, nicht
jedoch, was ein Client tun kann, sobald die Verbindung
hergestellt ist. Diese beiden Steuerungsformen sind für viele
MySQL-Administratoren interessant – insbesondere für solche,
die für Internetprovider tätig sind.
In MySQL 5.1 können Sie die folgenden Serverressourcen für einzelne Konten einschränken:
Anzahl der Abfragen, die ein Konto pro Stunde absetzen kann
Anzahl der Updates, die ein Konto pro Stunde durchführen kann
Häufigkeit, mit der ein Konto pro Stunde Verbindungen herstellen kann
Jede Anweisung, die ein Client absetzen kann, erhöht den Zähler für das Abfragelimit. Der Updatezähler hingegen wird nur bei Anweisungen hochgezählt, die Datenbanken oder Tabellen ändern.
Es ist auch möglich, die Anzahl gleichzeitiger Verbindungen zum Server pro Konto zu beschränken.
In diesem Kontext ist unter einem Konto ein Datensatz in der
Tabelle user
zu verstehen. Jedes Konto wird
durch die User
- und
Host
-Spaltenwerte eindeutig bezeichnet.
Voraussetzung für die Verwendung dieser Funktion ist, dass die
Tabelle user
in der
mysql
-Datenbank die ressourcenspezifischen
Spalten enthält. Ressourcenbeschränkungen sind in den Spalten
max_questions
,
max_updates
,
max_connections
und
max_user_connections
abgelegt. Wenn Ihre
Tabelle user
diese Spalten nicht aufweist,
muss sie aktualisiert werden. Siehe auch
Abschnitt 5.6, „mysql_fix_privilege_tables — Upgrade von MySQL-Systemtabellen“.
Um Ressourcenbeschränkungen mit einer
GRANT
-Anweisung einzustellen, verwenden Sie
eine WITH
-Klausel, die alle zu
beschränkenden Ressourcen und einen stundenbezogenen Zähler
benennt, der den jeweiligen Maximalwert angibt. Um also etwa ein
neues Konto zu erstellen, das auf die Datenbank
customer
in eingeschränkter Weise zugreifen
kann, setzen Sie folgende Anweisung ab:
mysql>GRANT ALL ON customer.* TO '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;
Nicht alle Beschränkungstypen müssen in der
WITH
-Klausel aufgeführt sein. Zudem ist die
Reihenfolge der aufgeführten Typen beliebig. Der Wert des
Stundenlimits sollte eine ganze Zahl sein, die den Wert pro
Stunde angibt. Wird die GRANT
-Anweisung ohne
WITH
-Klausel abgesetzt, dann werden alle
Beschränkungen auf den Standardwert Null gesetzt (d. h. es
gibt keine Beschränkungen). Bei
MAX_USER_CONNECTIONS
ist der Höchstwert eine
ganze Zahl, die die maximale Anzahl der Verbindungen angibt, die
das Konto gleichzeitig halten kann. Wenn der Wert auf die
Vorgabe Null gesetzt ist, bestimmt die Systemvariable
max_user_connections
die maximale Anzahl
gleichzeitiger Verbindungen für das Konto.
Um die Beschränkungen für ein vorhandenes Konto einzustellen
oder zu ändern, verwenden Sie eine GRANT
USAGE
-Anweisung auf der globalen Ebene (ON
*.*
). Die folgende Anweisung setzt das Abfragelimit
für francis
auf 100:
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_QUERIES_PER_HOUR 100;
Diese Anweisung ändert nicht die vorhandenen Berechtigungen des Kontos, sondern nur die vorhandenen Maximalwerte.
Um eine vorhandene Beschränkung zu entfernen, setzen Sie den
Wert auf Null. Um etwa die Beschränkung der Häufigkeit
aufzuheben, mit der francis
eine Verbindung
herstellen kann, verwenden Sie folgende Anweisung:
mysql>GRANT USAGE ON *.* TO 'francis'@'localhost'
->WITH MAX_CONNECTIONS_PER_HOUR 0;
Eine Zählung der Ressourcennutzung findet statt, wenn für ein Konto ein Wert ungleich Null für die Beschränkung einer bestimmten Ressource konfiguriert ist.
Wenn der Server läuft, ermittelt er, wie häufig jedes Konto welche Ressourcen verwendet. Wenn ein Konto die höchste Anzahl zulässiger Verbindungen innerhalb einer Stunde erreicht, werden weitere Verbindungsanfragen des Kontos abgewiesen, bis die Stunde verstrichen ist. Ähnlich werden weitere Abfragen oder Updates abgewiesen, wenn für diese der jeweilige Maximalwert durch ein Konto erreicht wird. In all diesen Fällen wird eine entsprechende Fehlermeldung angezeigt.
Die Zählung der Ressourcennutzungen erfolgt auf Konten- und nicht auf Clientbasis. Wenn Ihr Konto beispielsweise eine Beschränkung von 50 Abfragen pro Stunde hat, dann können Sie diese nicht verdoppeln, indem Sie gleichzeitig zwei Clientverbindungen zum Server herstellen. Die Abfragen, die über die beiden Verbindungen abgesetzt werden, werden zusammengezählt.
Die aktuellen Ressourcenzähler können global oder auch für einzelne Konten zurückgesetzt werden:
Um die aktuellen Zähler für alle Konten zu nullen, setzen
Sie eine FLUSH USER_RESOURCES
-Anweisung
ab. Die Werte können auch durch Neuladen der Grant-Tabellen
(etwa mit einer FLUSH
PRIVILEGES
-Anweisung oder dem Befehl
mysqladmin reload) zurückgesetzt werden.
Zähler eines bestimmten Kontos können auf Null gesetzt
werden, indem eine beliebige Beschränkung erneut definiert
wird. Verwenden Sie zu diesem Zweck wie oben beschrieben die
Anweisung GRANT USAGE
und geben Sie den
Wert, der für das Konto bereits festgelegt ist, erneut an.
Das Zurücksetzen der Zähler wirkt sich nicht auf die
Beschränkung MAX_USER_CONNECTIONS
aus.
Beim Serverstart beginnen alle Zähler bei Null zu zählen, d. h. vorhandene Werte lassen sich nicht über einen Neustart hinweg übertragen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.