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

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таблицу.

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

Hln
источник
6

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

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

jmcgrath207
источник
3
перезагрузка / перезагрузка - 100% рабочее решение любых проблем с компьютером. Однако в Prod перезагрузка не всегда возможна
asgs
2
У меня была та же проблема, и закрытие DataGrip внезапно сбросило все блокировки. Это кучка потраченного впустую времени ..
ScottBurfieldMills