Cerrar consultas MySQL en ejecución

Aunque no habitual, se pueden dar situaciones en las que una consulta SQL lleve más tiempo en completarse del que esperábamos, ya sea por funcionamiento problemático o por la propia complejidad de la misma.

Esto puede a su vez crear un efecto "cuello de botella", haciendo que el resto de consultas no puedan acceder a la tabla sobre la que actúa si es una acción que implica bloqueo de la misma durante la tarea.

Es por ello que puede ser útil saber que estas pueden ser cerradas de ser necesario.

Vía SSH o terminal integrada en cPanel

Como primer paso deberás conectar vía SSH a la cuenta, si tienes experiencia la conexión por medio de la terminal de instalada en tu equipo sería la solución ideal, en caso contrario la terminal integrada en cPanel sería una opción mucho más sencilla.

Por medio de consultas SQL desde el servidor MySQL

Una vez dentro de la terminal, nos conectamos con MySQL por medio del comando:

mysql -u usuario_mysql -p password

Donde usuario_mysql y password serían los datos de acceso de un usuario MySQL con permisos sobre la base de datos a la que queramos acceder.

Y ejecutamos la consulta que nos permite ver los procesos abiertos.

SHOW FULL PROCESSLIST;

Por medio de esta obtendremos una tabla con las consultas en ejecución y el tiempo que lleva abierta.

Tomamos el valor del campo ID de la que queremos cerrar y ejecutamos:

KILL IDENTIFICADOR;

Tras esto la consulta se forzaría a cerrar y ya no aparecería si ejecutamos de nuevo show full processlist.

Si en cambio se trata de varias y queremos cerrarlas todas de una vez, podemos ejecutar la siguiente consulta sustituyendo USUARIO_MYSQL por el usuario MySQL que está ejecutando dichas consultas abiertas.

SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') 
FROM information_schema.processlist 
WHERE USER = 'USUARIO_MYSQL';

Si prescindimos de la condición WHERE, cerrará todas las consultas SQL en ejecución con independencia del usuario o base de datos.

SELECT GROUP_CONCAT(CONCAT('KILL QUERY ',id,';') SEPARATOR ' ') 
FROM information_schema.processlist 

Usando la herramienta mysqladmin

Desde la terminal también disponemos de la herramienta mysqladmin que nos permite realizar esta misma acción, primero obtenemos un listado de las consultas SQL en ejecución usando:

mysqladmin proc

El listado mostrará las consultas indicando el ID, usaremos este identificador para cerrar la consulta por medio de:

mysqladmin kill ID

Ambos comandos se pueden combinar para cerrar todas las consultas en ejecución, primero imprimiendo el listado, obteniendo el identificador y ejecutando para cada uno mysqladmin kill, todo en un único comando:

mysqladmin proc | awk '{print $2}' | xargs -L1 mysqladmin kill

Si solo queremos cerrar las consultas de un usuario o que coincidan con un texto determinado, podemos añadir el comando grep para filtrar las consultas antes de pasarlas a mysqladmin kill:

mysqladmin proc | grep TEXTO_A_FILTRAR | awk '{print $2}' | xargs -L1 mysqladmin kill

Desde phpMyAdmin

Con el paso de los años phpMyAdmin se ha vuelto una herramienta cada vez más potente, en este caso podemos hacer uso de su interfaz para cerrar consultas en ejecución.

Accede a phpMyAdmin, selecciona la base de datos en cuestión y a continuación accede a la pestaña SQL.

Introducimos en la caja de consultas SQL:

SHOW FULL PROCESSLIST;

phpMyAdmin nos mostrará una tabla con los procesos abiertos y una opción al lado de cada consulta para cerrar de forma sencilla la tarea en ejecución.