MySQL kilitlerini nasıl gösterebilirim?


43

Bir mysql veritabanında aktif olan tüm kilitleri göstermek için yine de var mı?


1
INNODB_LOCK_WAITS ve INNODB_LOCKS tablolarını sorgulayabilirsiniz.

Yanıtlar:


38

InnoDB masaları ve uyarılar için Marko'nun bağlantısına bakınız.

MyISAM'a göre, "bu rahatsız edici bir sorgu budur" çözümü kolay bir ölü değildir. Her zaman bir işlem listesi ile başlamalısınız. Ancak, basılı anahtarların kesilmemesi için tam anahtar sözcüğü eklediğinizden emin olun:

SHOW FULL PROCESSLIST;

Bu size mevcut tüm işlemlerin bir listesini, onların SQL sorgularını ve durumlarını gösterecektir. Şimdi, genellikle tek bir sorgu birçok kişinin kilitlemesine neden oluyorsa, tanımlanması kolay olmalıdır. Etkilenen sorgular bir statüye sahip olacak Lockedve rahatsız edici sorgu kendi başına oturacak ve muhtemelen geçici bir tablo gibi yoğun bir şey bekleyecektir.

Açık değilse, o zaman hangi rahatsız edici SQL parçasının neden olabileceğini belirlemek için SQL kesinti gücünüzü kullanmak zorunda kalacaksınız.


20

InnoDB kullanıyorsanız ve çalışan sorguları kontrol etmeniz gerekiyorsa

show engine innodb status;

Marko'nun bağlantısında belirtildiği gibi. Bu size kilitleme sorgusunu, kaç tane satır / tablonun kilitlendiğini vb. Verir.

Kullanımdaki sorun, SHOW PROCESSLISTdiğer sorgular sıraya girmediği sürece kilitleri görmemenizdir.


20

Deneyin SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

Bence, özellikle birden fazla veritabanınız ve yüzlerce bağlantınız varsa, kullanım kilitlerini derhal tanımlamanın en iyi yolu budur.
nelaaro

7

Bu komutu kullanmak

SHOW PROCESSLIST

Tablolarda kilitleme işlemi de dahil olmak üzere, şu anda çalışmakta olan tüm işlemleri gösterecektir.


7

Cevapların hiçbiri şu anda tutulan tüm kilitleri gösteremez.

Bunu örneğin bir terminalde mysql içinde yapın.

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

Açıkça, yukarıdaki işlem bir işlem tutar, çünkü işlem halen aktif. Ancak şu anda hiçbir sorgu yapılmamaktadır ve hiç kimse hiçbir yerde kilit beklememektedir (en azından henüz).

INFORMATION_SCHEMA.INNODB_LOCKSdokümantasyon verilen anlamlıdır , çünkü yalnızca bir işlem vardır ve şu anda herhangi bir kilit için bekleyen kimse yoktur. Ayrıca INNODB_LOCKSyine de kullanımdan kaldırıldı.

SHOW ENGINE INNODB STATUSyararsızdır: someTablehiç bahsedilmez

SHOW FULL PROCESSLIST Boş, çünkü suçlu şu anda bir sorgu çalıştırmıyor.

Sen kullanabilirsiniz INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_historyve performance_schema.threadsbelirtilen herhangi bir aktif işlemler geçmişte yürütülen olduğunu sorguları ayıklamak için benim diğer yanıt , ama bunu görmek için herhangi bir şekilde rastlamak değil someTableyukarıdaki senaryoda kilitlenir.

Diğer cevaplardaki öneriler, en azından yardımcı olmaz.

Yasal Uyarı: Takılı innotop yüklü değil ve rahatsız etmedim. Belki bu işe yarayabilir.



4

Bu yazıdan alınan referans.

Aşağıdaki betiği kullanabilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.