Desarrollo y bases de datos

Cerrar consultas MySQL en ejecución

Revisado el 5 min de lectura mysql consultas

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

Donde usuario_mysql es un usuario MySQL con permisos sobre la base de datos. El cliente solicitará la contraseña sin dejarla escrita en el historial ni visible en la lista de procesos.

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 QUERY IDENTIFICADOR;

KILL QUERY detiene la consulta actual sin cerrar toda la conexión. Tras ejecutarlo, comprueba de nuevo el listado y el estado de la aplicación.

Si necesitas preparar varias órdenes, la siguiente consulta genera una sentencia por proceso del usuario indicado. No las ejecuta: revisa cada identificador, descarta tu propia sesión y cualquier consulta legítima de producción, y ejecuta después únicamente las sentencias necesarias.

SELECT CONCAT('KILL QUERY ', ID, ';') AS sentencia_a_revisar
FROM information_schema.PROCESSLIST
WHERE USER = 'USUARIO_MYSQL'
  AND COMMAND <> 'Sleep';

En un hosting gestionado solo podrás ver y detener los procesos permitidos por los privilegios de tu usuario. No elimines el filtro para intentar cerrar todo lo visible: también puedes interrumpir peticiones activas de tu propia web.

Usando la herramienta mysqladmin

Desde la terminal también disponemos de mysqladmin para listar procesos. Su orden kill no equivale a KILL QUERY: termina la conexión completa y puede interrumpir una transacción o una sesión de la aplicación.

mysqladmin -u USUARIO_MYSQL -p processlist

Usa el identificador con mysqladmin kill únicamente si has comprobado que puedes cerrar toda esa conexión:

mysqladmin -u USUARIO_MYSQL -p kill ID

Puedes indicar varios identificadores separados por comas, pero cada uno cerrará su conexión completa:

mysqladmin -u USUARIO_MYSQL -p kill 12,34,56

Para detener solo la sentencia activa, utiliza KILL QUERY desde MySQL. No encadenes processlist con awk, grep y xargs para cerrar procesos automáticamente: la salida contiene cabeceras y bordes, y una coincidencia imprecisa puede interrumpir consultas legítimas.

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, abre Estado y entra en Procesos. Esa vista muestra los procesos permitidos para tu usuario y, cuando tienes permisos, la acción para terminar cada uno. Revisa el identificador, el tiempo y la consulta antes de usarla.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.