SHOW PROCESSLIST es el comando que todo administrador de MySQL usa cuando necesita saber qué está pasando en el servidor en tiempo real. Muestra todas las conexiones activas, qué consulta está ejecutando cada una, cuánto tiempo lleva y en qué estado se encuentra. Es la herramienta principal para diagnosticar problemas de rendimiento, identificar consultas lentas, detectar bloqueos y gestionar conexiones problemáticas.
Uso básico
SHOW PROCESSLIST;| Id | User | Host | db | Command | Time | State | Info |
|---|---|---|---|---|---|---|---|
| 12 | app_web | 10.0.1.5:49832 | tienda_online | Query | 0 | executing | SELECT p.nombre, p.precio ... |
| 34 | app_web | 10.0.1.5:49847 | tienda_online | Sleep | 145 | NULL | |
| 56 | etl_usr | 10.0.1.8:51203 | analytics | Query | 892 | Sending data | INSERT INTO fact_ventas SE... |
| 78 | admin | localhost | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 91 | repl | 10.0.2.3:52100 | NULL | Binlog Dump | 86400 | Source has sent all... | NULL |
Cada columna proporciona información específica. Id es el identificador único de la conexión, que necesitarás si decides terminarla con KILL. User es el usuario MySQL de la conexión. Host muestra la dirección IP y el puerto del cliente. db es la base de datos seleccionada. Command indica el tipo de operación actual (Query, Sleep, Binlog Dump, etc.). Time muestra los segundos que lleva en el estado actual. State describe la fase específica de la operación. Info contiene el texto de la consulta en ejecución.
SHOW FULL PROCESSLIST
La versión estándar de SHOW PROCESSLIST trunca la columna Info a 100 caracteres. Para ver la consulta completa, usa SHOW FULL PROCESSLIST:
SHOW FULL PROCESSLIST;Esto es especialmente importante cuando necesitas ver consultas largas para entender exactamente qué están haciendo. Una consulta truncada puede ocultar la cláusula WHERE o los JOINs que son la causa del problema de rendimiento.
Un usuario normal solo ve sus propias conexiones. Para ver las conexiones de todos los usuarios, necesitas el privilegio PROCESS:
GRANT PROCESS ON *.* TO 'monitor'@'%';Identificar consultas lentas
Uno de los usos más comunes de SHOW PROCESSLIST es encontrar las consultas que están consumiendo más tiempo:
SELECT id, user, host, db, command, time,
SUBSTRING(info, 1, 200) AS consulta
FROM information_schema.PROCESSLIST
WHERE command = 'Query'
AND time > 10
ORDER BY time DESC;| id | user | host | db | command | time | consulta |
|---|---|---|---|---|---|---|
| 56 | etl_usr | 10.0.1.8:51203 | analytics | Query | 892 | INSERT INTO fact_ventas SELECT v.fecha, v.pr... |
| 23 | app_web | 10.0.1.5:49901 | tienda | Query | 45 | SELECT c.nombre, COUNT(p.id) FROM clientes c... |
El proceso 56 lleva casi 15 minutos. Si es un proceso ETL esperado, no hay problema. Pero si es una consulta que debería ser rápida, necesita investigación.
Para un resumen agrupado por usuario:
SELECT
user,
COUNT(*) AS conexiones,
SUM(CASE WHEN command = 'Sleep' THEN 1 ELSE 0 END) AS dormidas,
SUM(CASE WHEN command = 'Query' THEN 1 ELSE 0 END) AS activas,
MAX(time) AS mayor_tiempo
FROM information_schema.PROCESSLIST
GROUP BY user
ORDER BY conexiones DESC;| user | conexiones | dormidas | activas | mayor_tiempo |
|---|---|---|---|---|
| app_web | 42 | 38 | 4 | 45 |
| etl_usr | 3 | 0 | 3 | 892 |
| admin | 1 | 0 | 1 | 0 |
| repl | 1 | 0 | 0 | 86400 |
Terminar conexiones con KILL
Cuando identificas una conexión problemática (una consulta que consume todos los recursos, un bloqueo que impide que otros procesos avancen), puedes terminarla con el comando KILL:
-- Terminar la conexión completa
KILL 56;Query OK, 0 rows affected (0.00 sec)
Si solo quieres cancelar la consulta actual sin cerrar la conexión:
-- Cancelar solo la consulta, manteniendo la conexión
KILL QUERY 56;KILL QUERY es más amable: detiene la consulta en curso pero permite que la conexión siga viva para ejecutar nuevas consultas. KILL (sin QUERY) cierra toda la conexión, lo que puede causar errores en la aplicación si no maneja reconexiones.
Para terminar todas las conexiones de un usuario específico:
SELECT CONCAT('KILL ', id, ';') AS comando
FROM information_schema.PROCESSLIST
WHERE user = 'etl_usr'
AND command = 'Query'
AND time > 3600;| comando |
|---|
| KILL 56; |
| KILL 57; |
Alternativa con performance_schema
En MySQL 8.0, SHOW PROCESSLIST puede reemplazarse por consultas a performance_schema.processlist, que es más eficiente en servidores con muchas conexiones:
SELECT
PROCESSLIST_ID AS id,
PROCESSLIST_USER AS user,
PROCESSLIST_HOST AS host,
PROCESSLIST_DB AS db,
PROCESSLIST_COMMAND AS command,
PROCESSLIST_TIME AS time,
PROCESSLIST_STATE AS state,
SUBSTRING(PROCESSLIST_INFO, 1, 200) AS info
FROM performance_schema.processlist
WHERE PROCESSLIST_COMMAND != 'Sleep'
ORDER BY PROCESSLIST_TIME DESC;La diferencia principal es que performance_schema.processlist no requiere un mutex global para leer la lista de procesos, lo que lo hace más escalable en servidores con miles de conexiones.
Para habilitar esta alternativa como comportamiento por defecto de SHOW PROCESSLIST:
SET GLOBAL performance_schema_show_processlist = ON;Caso práctico: detectar y resolver un bloqueo
Imagina que los desarrolladores reportan que las consultas a la tabla productos están colgadas. Usas SHOW PROCESSLIST para investigar:
SHOW FULL PROCESSLIST;Encuentras que el proceso 34 lleva 10 minutos ejecutando un ALTER TABLE productos ADD INDEX ... y hay 15 conexiones esperando con estado Waiting for table metadata lock. El ALTER TABLE tomó un bloqueo de metadatos que impide que las otras consultas lean la tabla.
Tienes dos opciones: esperar a que el ALTER termine o cancelarlo:
-- Opción 1: Ver cuánto falta (si es posible estimarlo)
SELECT * FROM performance_schema.events_stages_current
WHERE THREAD_ID = (
SELECT THREAD_ID FROM performance_schema.threads
WHERE PROCESSLIST_ID = 34
);
-- Opción 2: Cancelar el ALTER para liberar las consultas
KILL 34;Después de matar el proceso, las 15 consultas pendientes se ejecutarán inmediatamente. El ALTER TABLE deberá reprogramarse para una ventana de mantenimiento con menor tráfico.
Caso práctico: monitoreo continuo
Para un monitoreo básico que se ejecute cada 5 segundos, puedes usar el comando \watch disponible en MySQL Shell, o un script de bash:
watch -n 5 "mysql --login-path=produccion -e \"
SELECT id, user, time, state,
SUBSTRING(info, 1, 80) AS query
FROM information_schema.PROCESSLIST
WHERE command = 'Query'
AND user != 'system user'
ORDER BY time DESC
LIMIT 10\""Esto te da una vista en tiempo real de las consultas más lentas del servidor, actualizada cada 5 segundos. Es una herramienta invaluable durante despliegues, migraciones o cualquier momento en que necesites vigilar el comportamiento del servidor.
SHOW PROCESSLIST es posiblemente el comando de diagnóstico más importante de MySQL. Dominar su uso te permitirá resolver problemas en tiempo real y mantener tu servidor funcionando de forma óptima. En el siguiente artículo veremos SHOW GRANTS, que revela los privilegios asignados a los usuarios.
Escrito por Eduardo Lázaro
