Die Tabelle kann nicht gelöscht werden, da sie auf das Sperren von Metadaten wartet


11

Wir versuchen, eine Tabelle zu löschen, aber sie wird hängen gelassen. Wenn der Befehl 'SHOW PROCESSLIST' angezeigt wird, wird er als 'Warten auf Metadatensperre' angezeigt. Selbst wir können keine Operation für diese bestimmte Tabelle ausführen. Weiß jemand, wie man es löst?

Antworten:


8

Wenn auf eine InnoDB-Tabelle überhaupt über SELECT oder DML (INSERT, UPDATE, DELETE) zugegriffen wird, sollten Sie zu Recht eine Metadatensperre erwarten.

Gemäß der MySQL-Dokumentation zu MetaData Locking :

Um die Serialisierbarkeit von Transaktionen sicherzustellen, darf der Server nicht zulassen, dass eine Sitzung eine DDL-Anweisung (Data Definition Language) für eine Tabelle ausführt, die in einer nicht abgeschlossenen Transaktion in einer anderen Sitzung verwendet wird. Der Server erreicht dies, indem er Metadatensperren für Tabellen erfasst, die innerhalb einer Transaktion verwendet werden, und die Freigabe dieser Sperren bis zum Ende der Transaktion verzögert. Eine Metadatensperre für eine Tabelle verhindert Änderungen an der Tabellenstruktur. Dieser Sperransatz hat zur Folge, dass eine Tabelle, die von einer Transaktion innerhalb einer Sitzung verwendet wird, erst nach Beendigung der Transaktion in DDL-Anweisungen von anderen Sitzungen verwendet werden kann.

Abgesehen davon sollten Sie feststellen, ob eine andere DB-Sitzung Sperren für die Tabelle hält oder nicht. Wenn es sich bei einer solchen Sitzung um eine nicht abgeschlossene Transaktion handelt, kann es zu Verzögerungen kommen.

Wenn Sie den Speicherplatz einfach schnell wieder benötigen, können Sie ihn ausführen TRUNCATE TABLE.

VORSCHLAG

Versuchen Sie, die Tabelle umzubenennen, bevor Sie versuchen, sie wie folgt zu löschen:

ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;

Der Vorschlag hat bei uns nicht funktioniert. Stattdessen erhalten wir "Warten auf Tabellen-Metadaten-Sperre" bei der fooUmbenennung von ALTER TABLEfootodrop
Motin

@Motin bedeutet nur, dass eine oder mehrere DB-Verbindungen noch auf die Tabelle zugegriffen haben foo. Sobald alle diese Verbindungen hergestellt wurden, ALTER TABLEkann der Vorgang fortgesetzt werden.
RolandoMySQLDBA

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.