Wie kann ich Clients von MySQL trennen?

9

Ich brauche eine effiziente Möglichkeit, alle Clients mit einem bestimmten Benutzernamen von MySQL zu trennen. Ich habe darüber nachgedacht, das Benutzerkennwort zu ändern, aber ich denke, dass dies nur überprüft wird, wenn die Verbindung hergestellt wird.

Ideen?

tmcallaghan
quelle

Antworten:

7

Sie können die unten stehende Methode "SQL to SQL" verwenden (übergeben Sie bei Bedarf einfach zusätzliche Verbindungsoptionen an den MySQL-Client):

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv

Hinweis: Dies funktioniert mit MySQL 5.1 und 5.5. Dies müsste für ältere MySQL-Versionen anders implementiert werden, da information_schema nicht über die Prozesslistentabelle verfügt.

Verwendete Optionen:

-N means that you do not want to get column names back.
-B puts it into batch mode, so that you do not get MySQL's table layout.
-e executes the following statement.
-v controls the verbosity, could be used up to three times.

Erklärung, wie es funktioniert:

Zuerst werden die KILL-Anweisungen zusammen mit IDs generiert.

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';"

Beispielausgabe:

KILL 1061;
KILL 1059;
KILL 1057;

Dann werden diese Anweisungen ausgeführt.

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv

Beispielausgabe:

--------------
KILL 1061
--------------

Query OK, 0 rows affected

--------------
KILL 1059
--------------

Query OK, 0 rows affected

--------------
KILL 1057
--------------

Query OK, 0 rows affected
dabest1
quelle
Dies ist für MySQL 5.5 viel direkter. +1 !!!
RolandoMySQLDBA
1

Unter Linux können Sie so etwas verwenden.

Mein Ansatz ist sehr einfach. Im ersten Schritt senden wir 'show processlist' an unsere Datenbank. Das Ergebnis ist eine Liste mit allen verbundenen Benutzern. Im nächsten Schritt verwenden wir den guten alten Befehl grep, um die Benutzernamen zu filtern. Mit awk generieren wir den 'kill Befehl'. Im letzten Schritt senden wir alle Kill-Befehle an MySQL. Alles muss mit dem | verkettet werden Symbol.

mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot
Marcel Zebrowski
quelle
Es wäre gut, eine kurze Erklärung für diesen Code hinzuzufügen.
RLF