Estoy tratando de realizar un DDL en una tabla y aparece el SHOW PROCESSLIST
mensaje "Esperando bloqueo de metadatos de la tabla".
¿Cómo puedo saber qué transacción aún no está cerrada?
Estoy usando MySQL v5.5.24.
SHOW ENGINE INNODB STATUS \G
Busque la sección -
TRANSACTIONS
Podemos utilizar las tablas INFORMATION_SCHEMA .
Consultas útiles
Para comprobar todas las transacciones de bloqueos que están esperando:
USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;
Una lista de transacciones de bloqueo:
SELECT *
FROM INNODB_LOCKS
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
O
SELECT INNODB_LOCKS.*
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);
Una lista de bloqueos en una mesa en particular:
SELECT * FROM INNODB_LOCKS
WHERE LOCK_TABLE = db_name.table_name;
Una lista de transacciones en espera de bloqueos:
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
Referencia - Solución de problemas de MySQL: Qué hacer cuando las consultas no funcionan , Capítulo 6 - Página 96.
INFORMATION_SCHEMA
base de datos.Si no puede encontrar el proceso que bloquea la mesa (porque ya está muerto), puede ser un hilo que aún se está limpiando así
sección TRANSACCIÓN de
al final
como se menciona en un comentario en ¿ Borrar bloqueo de transacciones?
puede intentar matar el hilo de la transacción directamente, aquí con
trabajó para mi.
fuente
mysql 5.7 expone la información de bloqueo de metadatos a través de la
performance_schema.metadata_locks
tabla.Documentación aquí
fuente
Tuve un problema similar con Datagrip y ninguna de estas soluciones funcionó.
Una vez que reinicié el Datagrip Client, ya no fue un problema y pude eliminar tablas nuevamente.
fuente