Неможливо скинути таблицю з моменту показу на очікування блокування метаданих


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;

Пропозиція не спрацювала для нас. Замість цього ми отримуємо "Очікування блокування метаданих таблиці" при fooперейменуванні ALTER TABLEfootodrop
Motin

@Motin все, що означає, що одне або кілька підключень до БД все ще мали доступ до таблиці foo. Як тільки всі ці з'єднання були зроблені, тоді ALTER TABLEможна продовжувати.
RolandoMySQLDBA

7

Ви повинні знайти, який запит викликає блокування транзакції, виконавши:

SHOW ENGINE INNODB STATUS

і дивіться розділ з назвою TRANSACTION. Пізніше ви повинні вбити цей запит, щоб скинути базу даних.

Довідка: Як дізнатися, яка транзакція спричиняє стан "Очікування блокування метаданих таблиці"?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.