Nie można upuścić tabeli, ponieważ pokazuje oczekiwanie na blokadę metadanych

11

Próbujemy upuścić jedną tabelę, ale zostaje ona powieszona, a kiedy widzimy polecenie „POKAŻ PROCESLISTĘ”, pokazuje się to jako „oczekiwanie na blokadę metadanych”. Nawet my nie jesteśmy w stanie wykonać żadnej operacji na tym konkretnym stole. Czy ktoś wie jak to rozwiązać?

ramya
źródło

Odpowiedzi:

8

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.

SUGESTIA

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;
RolandoMySQLDBA
źródło
Sugestia nie działała dla nas. Zamiast tego foofootodrop
pojawia
@Motin oznacza to tylko, że jedno lub więcej DB Connections nadal uzyskiwało dostęp do tabeli foo. Po wykonaniu wszystkich tych połączeń ALTER TABLEmożna kontynuować.
RolandoMySQLDBA