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.
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:
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.
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.
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.
INFORMATION_SCHEMAdatabase.