Если к таблице 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;
foo
переименовании ALTER TABLEfootodrop
foo
. После того, как все эти подключения были выполнены,ALTER TABLE
можно продолжить.Вы должны найти, какой запрос вызывает блокировку транзакции, выполнив:
и увидеть раздел с именем
TRANSACTION
. Позже вы должны убить этот запрос, чтобы удалить базу данных.Ссылка: Как определить, какая транзакция вызывает состояние «Ожидание блокировки метаданных таблицы»?
источник