Как найти, какая транзакция вызывает состояние "ожидание блокировки метаданных таблицы"?
Я пытаюсь выполнить некоторые DDL на столе и SHOW PROCESSLIST приводит к сообщению "ожидание блокировки метаданных таблицы".
Как я могу узнать, какая транзакция еще не закрыта?
Я используете MySQL версии 5.5.24.
4 ответов:
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;работал для меня.
mysql 5.7 предоставляет информацию о блокировке метаданных через
performance_schema.metadata_locksтаблица.документация здесь
У меня была аналогичная проблема с Datagrip и ни одно из этих решений работал.
Как только я перезапустил клиент Datagrip, это больше не было проблемой, и я мог снова отбросить таблицы.
Comments