Potrzebuję skutecznego sposobu na odłączenie wszystkich klientów o podanej nazwie użytkownika od MySQL. Myślałem o zmianie hasła użytkownika, ale myślę, że jest to sprawdzane tylko po nawiązaniu połączenia.
Pomysły?
Możesz użyć poniższej metody „SQL to SQL” (w razie potrzeby przekaż dodatkowe opcje połączenia klientowi mysql):
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Uwaga: Działa to z MySQL 5.1 i 5.5. Musi to zostać zaimplementowane inaczej w starszych wersjach MySQL, ponieważ informacje nie zawierają tabeli list procesów.
Zastosowane opcje:
-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.
Wyjaśnienie, jak to działa:
Najpierw generowane są instrukcje KILL wraz z identyfikatorami.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';"
Przykładowe dane wyjściowe:
KILL 1061;
KILL 1059;
KILL 1057;
Następnie te instrukcje są wykonywane.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Przykładowe dane wyjściowe:
--------------
KILL 1061
--------------
Query OK, 0 rows affected
--------------
KILL 1059
--------------
Query OK, 0 rows affected
--------------
KILL 1057
--------------
Query OK, 0 rows affected
W systemie Linux możesz użyć czegoś takiego.
Moje podejście jest bardzo proste. W pierwszym kroku wysyłamy „pokaż listę procesów” do naszej bazy danych. Rezultatem jest lista wszystkich podłączonych użytkowników. W następnym kroku używamy starej dobrej komendy grep do filtrowania nazw użytkowników. Za pomocą awk generujemy „polecenie zabicia”. W ostatnim kroku wysyłamy wszystkie polecenia kill do mysql. Wszystko musi być połączone z | symbol.
źródło