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

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

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

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

Ответ 1

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.

Ответ 2

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

раздел TRANSACTION

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;

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

Ответ 3

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

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

Ответ 4

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

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