Jak sprawdzić, która transakcja powoduje stan „Oczekiwanie na blokadę metadanych tabeli”?

99

Próbuję wykonać trochę DDL na tabeli i SHOW PROCESSLISTpowoduje 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.

Rysował
źródło

Odpowiedzi:

152
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.

Joddy
źródło
17
Tylko uwaga, że ​​wszystkie wymienione tabele znajdują się w INFORMATION_SCHEMAbazie danych.
Michael Mior
10
Czy te tabele InnoDB naprawdę zawierają informacje o blokadach metatdanych? Ten blogu sugeruje inaczej: mysql.wisborg.dk/2014/01/13/...
Gareth
1
@Gareth: działa do mysql -mysql-5-7-3-. Dzięki za aktualizację.
Joddy,
12
wszystkie miały puste zestawy ... a mimo to blokada jest nadal wyświetlana na
liście procesów
1
Sprawdź komentarz poniżej stackoverflow.com/a/36175882/362574
Joddy
52

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.

thibault ketterer
źródło
11

mysql 5.7 ujawnia informacje o blokadzie metadanych poprzez performance_schema.metadata_lockstabelę.

Dokumentacja tutaj

Hln
źródło
6

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.

jmcgrath207
źródło
3
restart / reboot - w 100% działające rozwiązanie dla wszelkich problemów z komputerem. Jednak w wersji Prod
ponowne
2
Miałem ten sam problem i zamknięcie DataGrip nagle upuściło wszystkie blokady. To trochę
straconego