Odpowiedzi:
Jeśli dostęp do tabeli InnoDB jest uzyskiwany w ogóle przez SELECT lub DML (INSERT, UPDATE, DELETE), należy słusznie oczekiwać blokady metadanych.
Zgodnie z dokumentacją MySQL na temat blokowania MetaData :
Aby zapewnić możliwość serializacji transakcji, serwer nie może zezwolić jednej sesji na wykonanie instrukcji języka definicji danych (DDL) w tabeli, która jest używana w niezakończonej transakcji w innej sesji. Serwer osiąga to poprzez uzyskanie blokad metadanych w tabelach używanych w transakcji i odroczenie ich zwolnienia do czasu zakończenia transakcji. Blokada metadanych w tabeli zapobiega zmianom w strukturze tabeli. To podejście blokujące ma implikację, że tabela używana przez transakcję w ramach jednej sesji nie może być używana w instrukcjach DDL przez inne sesje do czasu zakończenia transakcji.
To powiedziawszy, powinieneś ustalić, czy inna sesja DB trzyma blokady na stole. Jeśli taka sesja jest transakcją nieukończoną, może być miejsce na wstrzymanie.
Jeśli potrzebujesz szybko przywrócić miejsce na dysku, możesz uruchomić TRUNCATE TABLE
.
Spróbuj zmienić nazwę tabeli przed upuszczeniem w następujący sposób:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
. Po wykonaniu wszystkich tych połączeń ALTER TABLE
można kontynuować.
Należy dowiedzieć się, które zapytanie powoduje blokadę transakcji, wykonując:
SHOW ENGINE INNODB STATUS
i zobacz sekcję o nazwie TRANSACTION
. Później powinieneś zabić to zapytanie, aby usunąć bazę danych.
Odniesienie: Jak znaleźć, która transakcja powoduje stan „Oczekiwanie na blokadę metadanych tabeli”?
foo
footodrop