Come faccio a individuare la transazione che causa uno stato "In attesa di blocco dei metadati della tabella"?


95

Sto cercando di eseguire un po 'di DDL su una tabella e SHOW PROCESSLISTrisulta in un messaggio "In attesa di blocco dei metadati della tabella".

Come posso sapere quale transazione non è ancora chiusa?

Sto usando MySQL v5.5.24.

Risposte:


146
SHOW ENGINE INNODB STATUS \G

Cerca la sezione -

TRANSACTIONS

Possiamo usare le tabelle INFORMATION_SCHEMA .

Query utili

Per verificare tutti i blocchi in attesa di transazioni:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Un elenco di transazioni di blocco:

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

Un elenco di blocchi su una tabella particolare:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Un elenco di transazioni in attesa di blocchi:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Riferimento - Risoluzione dei problemi di MySQL: cosa fare quando le query non funzionano , Capitolo 6 - Pagina 96.


17
Solo una nota che tutte le tabelle a cui si fa riferimento sono nel INFORMATION_SCHEMAdatabase.
Michael Mior

9
Queste tabelle InnoDB contengono davvero informazioni sui blocchi dei metatdata? Questo post del blog suggerisce diversamente: mysql.wisborg.dk/2014/01/13/…
Gareth

1
@ Gareth: funziona fino a mysql -mysql-5-7-3-. Grazie per l'aggiornamento.
Joddy

11
tutti questi avevano set vuoti ... eppure c'è ancora il blocco mostrato
nell'elenco dei processi

1
Dai un'occhiata al commento qui sotto stackoverflow.com/a/36175882/362574
Joddy

50

Se non riesci a trovare il processo che blocca il tavolo (perché è già morto), potrebbe essere un thread che sta ancora pulendo in questo modo

sezione TRANSAZIONE di

show engine innodb status;

alla fine

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

come menzionato in un commento in Cancella deadlock delle transazioni?

puoi provare a uccidere direttamente il thread della transazione, qui con

 KILL 5208136;

ha funzionato per me.


10

mysql 5.7 espone le informazioni sul blocco dei metadati attraverso la performance_schema.metadata_lockstabella.

Documentazione qui


4

Ho avuto un problema simile con Datagrip e nessuna di queste soluzioni ha funzionato.

Una volta riavviato il client Datagrip, non era più un problema e potevo eliminare nuovamente le tabelle.


3
riavvio / riavvio: la soluzione funzionante al 100% per qualsiasi problema del computer. Tuttavia, in Prod, i riavvii non sono sempre possibili
asgs

1
Ho avuto lo stesso problema e la chiusura di DataGrip ha fatto cadere improvvisamente tutti i blocchi. È un mucchio di tempo sprecato ..
ScottBurfieldMills
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.