Cuando administramos una base de datos MySQL nos interesa conocer los procesos que hay en ejecución en la base de datos (consultas, updates, etc.).
En este artículo veremos cómo listar e interpretar los procesos que hay en ejecución así como matar dichos procesos.
Muestra los procesos que están en ejecución:
mysql> SHOW PROCESSLIST;
+-----+-------+-----------------------+-------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+-------+-----------------------+-------+---------+------+-------+------------------+
| 126 | cacti | localhost | cacti | Sleep | 0 | | NULL |
| 144 | root | 192.168.150.125:26974 | cacti | Sleep | 1276 | | NULL |
| 486 | cacti | localhost | cacti | Sleep | 6 | | NULL |
| 545 | cacti | localhost | cacti | Sleep | 6 | | NULL |
+-----+-------+-----------------------+-------+---------+------+-------+------------------+
15 rows in set (0.00 sec)
La columna "State" nos indica en qué estado se encuentra un proceso. A continuación se explican algunos estados:
Checking table
El flujo está realizando un chequeo (automático) de la tabla.
Closing tables
Significa que el flujo está volcando los datos que han cambiado de la tabla a disco y cerrando las tablas usadas.
Esto debe ser una operación rápido. Si no lo es, debe verificar que no tiene el disco lleno y que el disco no tiene un uso muy pesado.
Connect Out
Esclavo conectando con el maestro.
Copying to tmp table on disk
El conjunto de resultados temporal era mayor que tmp_table_size y el flujo está cambiando la tabla temporal de memoria a disco para ahorrar memoria.
Creating tmp table
El flujo está creando una tabla temporal para guardar parte del resultado de una consulta.
deleting from main table
El servidor está ejecutando la primera parte de un borrado de tablas múltiple y borrando sólo la primera tabla.
deleting from reference tables
El servidor está ejecutando la segunda parte de un borrado de tablas múltiples y borrando los registros coincidentes de las otras tablas.
Flushing tables
El flujo está ejecutando FLUSH TABLES y espera a que todos los flujos cierren sus tablas.
Killed
Alguien ha enviado un comando KILL al flujo y debería abortar en cuanto chequee el flag kill.
El flag se chequea en cada vuelta al bucle principal de MySQL, pero en algunos casos puede tardar algo de tiempo en que muera el flujo. Si el flujo está bloqueado por algún otro flujo, el kill tiene efecto en cuanto el otro flujo libera el bloqueo.
Locked
La consulta está bloqueada por otra consulta.
Sending data
El flujo está procesando registros para un comando SELECT y también enviando datos al cliente.
Sorting for group
El flujo está ordenando para un GROUP BY.
Sorting for order
El flujo está ordenando para un ORDER BY.
Opening tables
El flujo está intentando abrir una tabla. Esto debería ser un proceso muy rápido, a no ser que algo importante evite la abertura. Por ejemplo, un comando ALTER TABLE o LOCK TABLE puede evitar abrir una tabla hasta que el comando acabe.
Removing duplicates
La consulta usaba SELECT DISTINCT de forma que MySQL no podía optimizar las distintas operaciones en una fase temprana. Debido a ello, MySQL necesita una fase extra para borrar todos los registros duplicados antes de enviar el resultado al cliente.
Reopen table
El flujo obtivo un bloqueo para la tabla, pero se dio cuenta tras obtenerlo que la estructura de la tabla cambió. Se libera el bloqueo, cierra la tabla y trata de reabrirla.
Repair by sorting
El código de reparación está usando una ordenación para crear índices.
Repair with keycache
El código de reparación está usando creación de claves una a una en la caché de claves. Esto es mucho más lento que Repair by sorting.
Searching rows for update
El flujo hace una primera fase para encontrar todos los registro coincidentes antes de actualizarlos. Esto debe hacerse si UPDATE está cambiando el índice que se usa para encontrar los registros implicados.
Sleeping
El flujo espera que el cliente envíe un nuevo comando .
System lock
El flujo espera obtener un bloqueo de sistema externo para la tabla. Si no está usando múltiples servidors mysqld accediendo a las mismas tablas, puede deshabilitar los bloqueos de sistema con la opción --skip-external-locking .
Upgrading lock
El handler INSERT DELAYED trata de obtener un bloqueo para la tabla para insertar registros.
Updating
El flujo está buscando registros para actualizar.
User Lock
El flujo espera un GET_LOCK().
Waiting for tables
El flujo obtuvo una notificación que la estructura de la tabla cambió y necesita reabrirla. Sin embargo, para ello, debe esperar a que el resto de flujos cierren la tabla en cuestión.
Esta notificación tiene lugar si otro flujo ha usado FLUSH TABLES o uno de los siguientes comandos en la tabla en cuestión:
FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, o OPTIMIZE TABLE.
waiting for handler insert
El handler INSERT DELAYED ha procesado las inserciones pendientes y espera nuevas.
Con este comando podemos matar un proceso:
KILL [CONNECTION | QUERY] thread_
Cuando se hace un KILL, se activa un flag específico para el proceso. Puede que el proceso tarde en morir porque el flag kill solo se chequea cada ciertos intervalos:
En SELECT, ORDER BY y GROUP BY , el flag se chequea tras leer un bloque de registros. Si el flag kill está activado, el comando se aborta.
Durante ALTER TABLE, el flag kill se chequea antes de que se lea cada bloque de registros de la tabla original. Si el flag kill está activado, el comando se aborta y la tabla temporal se borra.
Durante operaciones UPDATE o DELETE , el flag kill se chequea tras cada lectura de bloque y tras cada registro borrado o actualizado. Si el flag kill está activado, el comando se aborta. Tenga en cuenta que si no está usando transacciones, los cambios no se deshacen.
GET_LOCK() aborta y retorna NULL.
Un flujo INSERT DELAYED rápidamente vuelca (inserta) todos los registros que tiene en memoria y luego termina.
Si el flujo está en el handler de bloqueo (estado: Locked), el bloqueo de tabla se aborta rápidamente.
Si el flujo está esperando a espacio libre en disco en una llamada de lectura, la escritura se aborta con un mensaje de error "disco lleno".
Advertencia: Matar una operación REPAIR TABLE o OPTIMIZE TABLE en una tabla MyISAM resulta en una tabla que corrupta y no usable. Cualquier lectura o escritura en una tabla así falla hasta que la optimiza o repara de nuevo (sin interrupción).
Comentarios recientes
8 weeks 1 day ago
22 weeks 2 days ago
27 weeks 5 days ago
36 weeks 3 days ago
44 weeks 2 days ago
51 weeks 5 days ago
1 year 3 days ago
1 year 12 weeks ago
1 year 12 weeks ago
1 year 15 weeks ago