Como posso desconectar clientes do MySQL?

9

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?

tmcallaghan
fonte

Respostas:

7

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
dabest1
fonte
Isso é muito mais direto para o MySQL 5.5. +1 !!!
RolandoMySQLDBA
1

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.

mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot
Marcel Zebrowski
fonte
Seria bom adicionar uma breve explicação para esse código.
RLF