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


95

Я намагаюся виконати деяку DDL на таблиці, і в SHOW PROCESSLISTрезультаті з’являється повідомлення "Очікування блокування метаданих таблиці".

Як я можу дізнатись, яка транзакція ще не закрита?

Я використовую MySQL v5.5.24.

Відповіді:


148
SHOW ENGINE INNODB STATUS \G

Шукайте розділ -

TRANSACTIONS

Ми можемо використовувати таблиці INFORMATION_SCHEMA .

Корисні запити

Щоб перевірити всі замки, на які чекають транзакції:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Список блокуючих транзакцій:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

АБО

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Список замків на конкретному столі:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Список транзакцій, що очікують на блокування:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Довідково - Виправлення неполадок MySQL: Що робити, коли запити не працюють , Глава 6 - Сторінка 96.


17
Тільки зверніть увагу, що всі таблиці, на які посилаються, знаходяться в INFORMATION_SCHEMAбазі даних.
Michael Mior

9
Чи справді ці таблиці InnoDB містять інформацію про блокування метаданих? Цей допис у блозі передбачає інше: mysql.wisborg.dk/2014/01/13/…
Гарет

1
@Gareth: працює до mysql -mysql-5-7-3-. Дякуємо за оновлення.
Джодді

11
всі вони мали порожні набори ... все ж замок все ще відображається у
списку

1
Перевірте коментар нижче stackoverflow.com/a/36175882/362574
Joddy

50

Якщо ви не можете знайти процес блокування таблиці (оскільки він уже мертвий), можливо, це нитка все ще очищається таким чином

розділ ОПЕРАЦІЯ з

show engine innodb status;

в кінці

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

як зазначено в коментарі в Очистити тупик транзакцій?

Ви можете спробувати вбити потік транзакції безпосередньо, тут з

 KILL 5208136;

працював у мене.


10

mysql 5.7 виставляє інформацію про блокування метаданих через performance_schema.metadata_locksтаблицю.

Документація тут


4

У мене була подібна проблема з Datagrip, і жодне з цих рішень не працювало.

Після того, як я перезапустив клієнт Datagrip, це вже не проблема, і я міг знову скидати таблиці.


3
перезавантажити / перезавантажити - 100% робоче рішення для будь-яких проблем із комп’ютером. Однак у Prod перезавантаження не завжди можливо
запитання

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