Wie finde ich heraus, welche Transaktion den Status "Warten auf Tabellenmetadatensperre" verursacht?

94

Ich versuche, eine DDL für eine Tabelle auszuführen, und es SHOW PROCESSLISTwird die Meldung "Warten auf Sperre der Tabellenmetadaten" angezeigt.

Wie kann ich herausfinden, welche Transaktion noch nicht abgeschlossen ist?

Ich verwende MySQL v5.5.24.

Drew
quelle

Antworten:

145
SHOW ENGINE INNODB STATUS \G

Suchen Sie nach dem Abschnitt -

TRANSACTIONS

Wir können INFORMATION_SCHEMA- Tabellen verwenden.

Nützliche Abfragen

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

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Eine Liste blockierender 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 der Sperren für eine bestimmte Tabelle:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Eine Liste der 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.

Joddy
quelle
17
Nur ein Hinweis, dass sich alle Tabellen, auf die verwiesen wird, in der INFORMATION_SCHEMADatenbank befinden.
Michael Mior
9
Enthalten diese InnoDB-Tabellen wirklich Informationen zu Metatdata-Sperren? Dieser Blog-Beitrag schlägt etwas anderes vor: mysql.wisborg.dk/2014/01/13/…
Gareth
1
@Gareth: funktioniert bis mysql -mysql-5-7-3-. Danke für Update.
Joddy
11
Alle diese hatten leere Sätze ... dennoch wird die Sperre auf der Prozessliste angezeigt ...
K2xL
1
Überprüfen Sie heraus den Kommentar unten stackoverflow.com/a/36175882/362574
Joddy
50

Wenn Sie den Prozess nicht finden können, der die Tabelle sperrt (weil sie bereits tot ist), ist es möglicherweise ein Thread, der immer noch so bereinigt

Abschnitt TRANSAKTION von

show engine innodb status;

Am Ende

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

Wie in einem Kommentar in Clear Transaction Deadlock erwähnt?

Sie können versuchen, den Transaktions-Thread hier direkt mit zu beenden

 KILL 5208136;

arbeitete für mich.

Thibault Ketterer
quelle
10

MySQL 5.7 macht Informationen zur Metadatensperre in der performance_schema.metadata_locksTabelle verfügbar .

Dokumentation hier

Hln
quelle
4

Ich hatte ein ähnliches Problem mit Datagrip und keine dieser Lösungen funktionierte.

Nach dem Neustart des Datagrip-Clients war dies kein Problem mehr und ich konnte Tabellen wieder löschen.

jmcgrath207
quelle
3
Neustart / Neustart - die 100% funktionierende Lösung für alle Computerprobleme. In Prod sind Neustarts jedoch nicht immer möglich
wie
1
Ich hatte das gleiche Problem und beim Schließen von DataGrip wurden plötzlich alle Sperren gelöscht. Das ist eine Menge verschwendeter Zeit.
ScottBurfieldMills