Відповіді:
Якщо до таблиці 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 TABLE
можна продовжувати.
Ви повинні знайти, який запит викликає блокування транзакції, виконавши:
SHOW ENGINE INNODB STATUS
і дивіться розділ з назвою TRANSACTION
. Пізніше ви повинні вбити цей запит, щоб скинути базу даних.
Довідка: Як дізнатися, яка транзакція спричиняє стан "Очікування блокування метаданих таблиці"?
foo
перейменуванні ALTER TABLEfootodrop