Jak mogę wyświetlić zamki MySQL?


44

Czy w ogóle można wyświetlić wszystkie blokady aktywne w bazie danych mysql?


1
Możesz przeszukiwać tabele INNODB_LOCK_WAITS i INNODB_LOCKS.

Odpowiedzi:


39

Zobacz link Marko do tabel InnoDB i ostrzeżeń.

Dla MyISAM nie jest to łatwe rozwiązanie „to obraźliwe zapytanie”. Zawsze powinieneś zacząć od listy procesów. Pamiętaj jednak, aby dołączyć pełne słowo kluczowe, aby drukowane zapytania nie były obcinane:

SHOW FULL PROCESSLIST;

Spowoduje to wyświetlenie listy wszystkich bieżących procesów, ich zapytań SQL i stanu. Zwykle teraz, gdy jedno zapytanie powoduje zablokowanie wielu innych, identyfikacja powinna być łatwa. Kwerendy, których dotyczy problem, będą miały status, Lockeda niepoprawne zapytanie będzie siedziało samo, prawdopodobnie czekając na coś intensywnego, na przykład tymczasową tabelę.

Jeśli nie jest to oczywiste, będziesz musiał użyć swoich uprawnień do dedukcji SQL, aby ustalić, który fragment obrażającego SQL może być przyczyną twoich nieszczęść.


20

Jeśli korzystasz z InnoDB i chcesz sprawdzić uruchomione zapytania, polecam

show engine innodb status;

jak wspomniano w łączu Marko. To da ci zapytanie blokujące, ile wierszy / tabel jest przez niego zablokowanych itp. Zajrzyj do TRANSAKCJI.

Problem z używaniem SHOW PROCESSLISTpolega na tym, że blokady nie będą widoczne, dopóki inne zapytania nie ustawią się w kolejce.


20

Spróbuj SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

Myślę, że to najlepszy sposób na natychmiastową identyfikację używanych blokad, szczególnie jeśli masz wiele baz danych i setki połączeń.
nelaaro,

7

Za pomocą tego polecenia

SHOW PROCESSLIST

pokaże wszystkie aktualnie uruchomione procesy, w tym procesy, które uzyskały blokadę tabel.


7

Żadna z odpowiedzi nie pokazuje wszystkich blokad, które są aktualnie wstrzymywane.

Zrób to np. W mysql w terminalu.

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

Oczywiście powyższa transakcja zawiera blokadę, ponieważ transakcja jest nadal aktywna. Ale w tej chwili nie odbywa się żadne zapytanie i nikt nie czeka nigdzie na zamek (przynajmniej jeszcze).

INFORMATION_SCHEMA.INNODB_LOCKSjest pusta, co ma sens, biorąc pod uwagę dokumentację , ponieważ jest tylko jedna transakcja i obecnie nikt nie czeka na żadne blokady. I INNODB_LOCKStak jest przestarzałe.

SHOW ENGINE INNODB STATUSjest bezużyteczny: someTablew ogóle nie jest wspomniany

SHOW FULL PROCESSLIST jest pusty, ponieważ sprawca aktualnie nie uruchamia zapytania.

Można użyć INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_historyi performance_schema.threadswyodrębnić zapytań wszelkie aktywne transakcje wykonywane w przeszłości, jak przedstawiono w drugiej moją odpowiedź , ale nie natknąć żaden sposób, aby zobaczyć, że someTablejest zablokowana w powyższym scenariuszu.

Sugestie zawarte w innych odpowiedziach do tej pory przynajmniej nie pomogą.

Oświadczenie: Nie mam zainstalowanego programu Innotop i nie zawracałem sobie głowy. Może to może zadziałać.


6

AFAIK wciąż nie ma natywnego sposobu w MYSQL, ale używam innotop . Jest bezpłatny i ma wiele innych funkcji.

Zobacz także ten link, aby uzyskać więcej informacji na temat korzystania z narzędzia Innotop.


4

Referencje zaczerpnięte z tego postu.

Możesz użyć poniższego skryptu:

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.