Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie finde ich heraus, welche Transaktion den Sperrstatus „Warten auf Tabellenmetadaten“ verursacht?

Funktioniert für MySQL-Version <5.7.3

SHOW ENGINE INNODB STATUS \G

Suchen Sie nach dem Abschnitt -

TRANSACTIONS

Wir können INFORMATION_SCHEMA verwenden Tabellen.

Nützliche Abfragen

So überprüfen Sie alle Sperren, auf die Transaktionen warten:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Eine Liste der blockierenden Transaktionen:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

ODER

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Eine Liste von Sperren für eine bestimmte Tabelle:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Eine Liste von Transaktionen, die auf Sperren warten:

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

Referenz - MySQL-Fehlerbehebung:Was tun, wenn Abfragen nicht funktionieren , Kapitel 6 - Seite 96.