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;
foo
Umbenennung von ALTER TABLEfootodrop
foo
. Sobald alle diese Verbindungen hergestellt wurden,ALTER TABLE
kann der Vorgang fortgesetzt werden.Sie sollten herausfinden, welche Abfrage eine Transaktionssperre verursacht, indem Sie Folgendes ausführen:
und siehe einen Abschnitt mit dem Namen
TRANSACTION
. Später sollten Sie diese Abfrage beenden, um eine Datenbank zu löschen.Referenz: Wie finde ich heraus, welche Transaktion den Status "Warten auf Tabellenmetadatensperre" verursacht?
quelle