Mysql
 sql >> Database >  >> RDS >> Mysql

Come faccio a trovare quale transazione sta causando uno stato di blocco dei metadati della tabella in attesa?

Funziona con la versione MySql <5.7.3

SHOW ENGINE INNODB STATUS \G

Cerca la sezione -

TRANSACTIONS

Possiamo utilizzare INFORMATION_SCHEMA Tabelle.

Query utili

Per controllare tutti i blocchi che le transazioni stanno aspettando:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Un elenco di transazioni bloccanti:

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

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.