Я пытаюсь выполнить DDL для таблицы, и в SHOW PROCESSLIST
результате появляется сообщение «Ожидание блокировки метаданных таблицы».
Как я могу узнать, какая транзакция еще не закрыта?
Я использую MySQL v5.5.24.
Я пытаюсь выполнить 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 Client, это больше не было проблемой, и я снова мог отбрасывать таблицы.
INFORMATION_SCHEMA
базе данных.