Невозможно удалить таблицу, так как она показывает ожидание блокировки метаданных

11

Мы пытаемся отбросить одну таблицу, но она зависает, и когда мы видим команду «SHOW PROCESSLIST», она отображается как «ожидание блокировки метаданных». Даже мы не можем выполнить какую-либо операцию с этим конкретным столом. Кто-нибудь знает, как решить это?

рамйа
источник

Ответы:

8

Если к таблице InnoDB обращаются вообще через SELECT или DML (INSERT, UPDATE, DELETE), вы должны по праву ожидать блокировку метаданных.

Согласно документации MySQL по блокировке метаданных :

Чтобы обеспечить сериализацию транзакций, сервер не должен разрешать одному сеансу выполнять оператор языка определения данных (DDL) для таблицы, которая используется в незавершенной транзакции в другом сеансе. Сервер достигает этого, получая блокировки метаданных для таблиц, используемых в транзакции, и откладывая освобождение этих блокировок до завершения транзакции. Блокировка метаданных на таблице предотвращает изменения в структуре таблицы. Этот подход к блокировке подразумевает, что таблица, которая используется транзакцией в рамках одного сеанса, не может использоваться в инструкциях DDL другими сеансами, пока транзакция не завершится.

Тем не менее, вы должны определить, удерживает ли другой сеанс БД блокировки таблицы. Если такой сеанс является незавершенной транзакцией, существует задержка.

Если вам просто нужно быстро восстановить дисковое пространство, вы можете запустить TRUNCATE TABLE.

ПРЕДЛОЖЕНИЕ

Попробуйте переименовать таблицу, прежде чем пытаться удалить ее следующим образом:

ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
RolandoMySQLDBA
источник
Предложение не работает для нас. Вместо этого мы получаем «Ожидание блокировки метаданных таблицы» при fooпереименовании ALTER TABLEfootodrop
Motin
@ Все это означает, что одно или несколько соединений с БД все еще обращались к таблице foo. После того, как все эти подключения были выполнены, ALTER TABLEможно продолжить.
RolandoMySQLDBA
7

Вы должны найти, какой запрос вызывает блокировку транзакции, выполнив:

SHOW ENGINE INNODB STATUS

и увидеть раздел с именем TRANSACTION. Позже вы должны убить этот запрос, чтобы удалить базу данных.

Ссылка: Как определить, какая транзакция вызывает состояние «Ожидание блокировки метаданных таблицы»?

Петер Вендерберге
источник