Я намагаюся виконати деяку DDL на таблиці, і в SHOW PROCESSLISTрезультаті з’являється повідомлення "Очікування блокування метаданих таблиці".
Як я можу дізнатись, яка транзакція ще не закрита?
Я використовую MySQL v5.5.24.
Відповіді:
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.
Якщо ви не можете знайти процес блокування таблиці (оскільки він уже мертвий), можливо, це нитка все ще очищається таким чином
розділ ОПЕРАЦІЯ з
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;
працював у мене.
У мене була подібна проблема з Datagrip, і жодне з цих рішень не працювало.
Після того, як я перезапустив клієнт Datagrip, це вже не проблема, і я міг знову скидати таблиці.
INFORMATION_SCHEMAбазі даних.