Necesito una forma eficiente de desconectar a todos los clientes con un nombre de usuario determinado de MySQL. Pensé en cambiar la contraseña de los usuarios, pero creo que solo se verifica cuando se realiza la conexión.
Ideas?
Puede usar el método "SQL to SQL" a continuación (simplemente pase opciones de conexión adicionales al cliente mysql según sea necesario):
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Nota: Esto funciona con MySQL 5.1 y 5.5. Esto tendría que implementarse de manera diferente para las versiones anteriores de MySQL ya que information_schema no tiene la tabla de lista de procesos.
Opciones 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.
Explicación de cómo funciona:
Primero, las declaraciones KILL se generan junto con los ID.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';"
Salida de muestra:
KILL 1061;
KILL 1059;
KILL 1057;
Entonces esas declaraciones se ejecutan.
shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv
Salida de muestra:
--------------
KILL 1061
--------------
Query OK, 0 rows affected
--------------
KILL 1059
--------------
Query OK, 0 rows affected
--------------
KILL 1057
--------------
Query OK, 0 rows affected
En Linux puedes usar algo así.
Mi enfoque es muy simple. En el primer paso enviamos 'mostrar lista de procesos' a nuestra base de datos. El resultado es una lista con todos los usuarios conectados. En el siguiente paso usamos el viejo comando grep para filtrar los nombres de usuario. Con awk generamos el 'comando kill'. En el último paso enviamos todos los comandos kill a mysql. Todo tiene que ser concatenado con el | símbolo.
fuente