Как узнать, какая транзакция вызывает состояние «Ожидание блокировки метаданных таблицы»?


99

Я пытаюсь выполнить DDL для таблицы, и в SHOW PROCESSLISTрезультате появляется сообщение «Ожидание блокировки метаданных таблицы».

Как я могу узнать, какая транзакция еще не закрыта?

Я использую MySQL v5.5.24.

Ответы:


152
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базе данных.
— Майкл Миор

10
Действительно ли эти таблицы InnoDB содержат информацию о блокировках метатданных? Это сообщение в блоге предполагает иное: mysql.wisborg.dk/2014/01/13/…
— Гарет

1
@Gareth: работает до mysql -mysql-5-7-3-. Спасибо за обновление.
— Джодди

12
все они имели пустые наборы ... но в списке процессов все еще отображается блокировка ...
— K2xL

1
Посмотрите комментарий ниже stackoverflow.com/a/36175882/362574
— Джодди

52

Если вы не можете найти процесс, блокирующий таблицу (потому что он уже мертв), это может быть поток, все еще очищающий, как это

раздел СДЕЛКА

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;

работал у меня.


12

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

Документация здесь


6

У меня была аналогичная проблема с Datagrip, и ни одно из этих решений не помогло.

Как только я перезапустил Datagrip Client, это больше не было проблемой, и я снова мог отбрасывать таблицы.


3
перезагрузка / перезагрузка - 100% рабочее решение любых проблем с компьютером. Однако в Prod перезагрузка не всегда возможна
— asgs

2
У меня была та же проблема, и закрытие DataGrip внезапно сбросило все блокировки. Это кучка потраченного впустую времени ..
— ScottBurfieldMills
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.