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?
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:
È 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
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