Próbuję wykonać trochę DDL na tabeli i SHOW PROCESSLIST
powoduje wyświetlenie komunikatu „Oczekiwanie na blokadę metadanych tabeli”.
Jak mogę się dowiedzieć, która transakcja nie została jeszcze zamknięta?
Używam MySQL w wersji 5.5.24.
SHOW ENGINE INNODB STATUS \G
Poszukaj sekcji -
TRANSACTIONS
Możemy korzystać z tabel INFORMATION_SCHEMA .
Przydatne zapytania
Aby sprawdzić wszystkie blokady, na które czekają transakcje:
USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;
Lista transakcji blokujących:
SELECT *
FROM INNODB_LOCKS
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
LUB
SELECT INNODB_LOCKS.*
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);
Lista zamków na konkretnej tabeli:
SELECT * FROM INNODB_LOCKS
WHERE LOCK_TABLE = db_name.table_name;
Lista transakcji oczekujących na blokady:
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
Odniesienie - Rozwiązywanie problemów z MySQL: co zrobić, gdy zapytania nie działają , rozdział 6 - strona 96.
INFORMATION_SCHEMA
bazie danych.Jeśli nie możesz znaleźć procesu blokującego stół (ponieważ jest już martwy), może to być wątek wciąż czyszczący się w ten sposób
sekcja TRANSAKCJA z
show engine innodb status;
na końcu
---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
jak wspomniano w komentarzu w artykule Usunąć zakleszczenie transakcji?
możesz spróbować bezpośrednio zabić wątek transakcji, tutaj za pomocą
KILL 5208136;
pracował dla mnie.
źródło
mysql 5.7 ujawnia informacje o blokadzie metadanych poprzez
performance_schema.metadata_locks
tabelę.Dokumentacja tutaj
źródło
Miałem podobny problem z Datagrip i żadne z tych rozwiązań nie działało.
Po ponownym uruchomieniu klienta Datagrip nie był to już problem i mogłem ponownie porzucić tabele.
źródło