¿Cómo encuentro qué transacción está causando un estado "Esperando bloqueo de metadatos de tabla"?

96

Estoy tratando de realizar un DDL en una tabla y aparece el SHOW PROCESSLISTmensaje "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.

Dibujó
fuente

Respuestas:

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

Joddy
fuente
17
Solo una nota que todas las tablas referenciadas están en la INFORMATION_SCHEMAbase de datos.
Michael Mior
9
¿Estas tablas InnoDB realmente contienen información sobre bloqueos de metadatos? Esta publicación de blog sugiere lo contrario: mysql.wisborg.dk/2014/01/13/…
Gareth
1
@Gareth: funciona hasta mysql -mysql-5-7-3-. Gracias por la actualización.
Joddy
11
todos estos tenían conjuntos vacíos ... sin embargo, todavía se muestra el bloqueo en la lista de procesos ...
K2xL
1
Echa un vistazo al comentario a continuación stackoverflow.com/a/36175882/362574
Joddy
50

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

show engine innodb status;

al final

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

como se menciona en un comentario en ¿ Borrar bloqueo de transacciones?

puede intentar matar el hilo de la transacción directamente, aquí con

 KILL 5208136;

trabajó para mi.

thibault ketterer
fuente
10

mysql 5.7 expone la información de bloqueo de metadatos a través de la performance_schema.metadata_lockstabla.

Documentación aquí

Hln
fuente
4

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.

jmcgrath207
fuente
3
reiniciar / reiniciar: la solución 100% funcional para cualquier problema de la computadora. Sin embargo, en Prod, los reinicios no siempre son posibles
dice el
2
Tuve el mismo problema y al cerrar DataGrip de repente se cayeron todos los bloqueos. Eso es un montón de tiempo perdido ...
ScottBurfieldMills