Come posso disconnettere i client da MySQL?


9

Ho bisogno di un modo efficiente per disconnettere tutti i client con un determinato nome utente da MySQL. Ho pensato di cambiare la password dell'utente, ma penso che sia verificato solo quando viene stabilita la connessione.

Idee?

Risposte:


7

È possibile utilizzare il metodo "SQL to SQL" di seguito (basta passare le opzioni di connessione extra al client mysql secondo necessità):

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

Nota: funziona con MySQL 5.1 e 5.5. Questo dovrebbe essere implementato diversamente per le versioni precedenti di MySQL poiché information_schema non ha la tabella processlist.

Opzioni utilizzate:

-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.

Spiegazione di come funziona:

Innanzitutto vengono generate le istruzioni KILL insieme agli ID.

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

Uscita campione:

KILL 1061;
KILL 1059;
KILL 1057;

Quindi tali dichiarazioni vengono eseguite.

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

Uscita campione:

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

Query OK, 0 rows affected

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

Query OK, 0 rows affected

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

Query OK, 0 rows affected

Questo è molto più diretto per MySQL 5.5. +1 !!!
RolandoMySQLDBA

1

Su Linux puoi usare qualcosa del genere.

Il mio approccio è molto semplice. Nel primo passaggio inviamo "show processlist" al nostro database. Il risultato è un elenco con tutti gli utenti connessi. Nel passaggio successivo usiamo il buon vecchio comando grep per filtrare i nomi utente. Con awk generiamo il "comando kill". Nell'ultimo passaggio inviamo tutti i comandi kill a mysql. Tutto deve essere concatenato con il | simbolo.

mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot

Sarebbe bene aggiungere una breve spiegazione per questo codice.
RLF,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.