Eu preciso de uma maneira eficiente de desconectar todos os clientes com um determinado nome de usuário do MySQL. Pensei em alterar a senha do usuário, mas acho que isso só é verificado quando a conexão é feita.
Ideias?
Você pode usar o método "SQL para SQL" abaixo (basta passar opções extras de conexão para o cliente mysql, conforme necessário):
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Nota: Isso funciona com o MySQL 5.1 e 5.5. Isso teria que ser implementado de maneira diferente para versões mais antigas do MySQL, pois information_schema não possui a tabela processlist.
Opções utilizadas:
-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.
Explicação de como funciona:
Primeiro, as instruções KILL são geradas junto com os IDs.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';"
Saída de amostra:
KILL 1061;
KILL 1059;
KILL 1057;
Então essas instruções são executadas.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Saída de amostra:
--------------
KILL 1061
--------------
Query OK, 0 rows affected
--------------
KILL 1059
--------------
Query OK, 0 rows affected
--------------
KILL 1057
--------------
Query OK, 0 rows affected
No Linux, você pode usar algo assim.
Minha abordagem é muito simples. Na primeira etapa, enviamos 'show processlist' para o nosso banco de dados. O resultado é uma lista com todos os usuários conectados. Na próxima etapa, usamos o bom e velho comando grep para filtrar os nomes de usuário. Com o awk, geramos o 'comando kill'. Na última etapa, enviamos todos os comandos kill para o mysql. Tudo tem que ser concatenado com o | símbolo.
fonte