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.

SHOW PROCESSLIST

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.

 

KILL thread_id

Con este comando podemos matar un proceso:

KILL [CONNECTION | QUERY] thread_
 
Opcionalmente podemos hacer un KILL a una CONNECTION o a una QUERY:
  • KILL CONNECTION: es lo mismo que KILL, termina la conexión asociada a un thread_id dado.
  • KILL QUERY: termina el comando que la conexión está ejecutando actualmente, pero deja la conexión intacta.

 

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).