it-swarm.asia

MySQL kilitlerini nasıl gösterebilirim?

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

54
Rory

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

MyISAM için, "bu rahatsız edici sorgu" çözümü ölü bir kolay değildir. Her zaman bir işlem listesiyle başlamalısınız. Ancak, yazdırılan sorguların kısaltılmaması için tam anahtar kelimeyi eklediğinizden emin olun:

SHOW FULL PROCESSLIST;

Bu size mevcut tüm işlemlerin, SQL sorgularının ve durumlarının bir listesini gösterecektir. Şimdi genellikle tek bir sorgu başkalarının kilitlenmesine neden oluyorsa, tanımlanması kolay olmalıdır. Etkilenen sorgular Locked statüsüne sahip olur ve rahatsız edici sorgu kendiliğinden oturur ve muhtemelen geçici bir tablo gibi yoğun bir şey bekler.

Belli değilse, hangi rahatsız edici SQL parçasının sıkıntılarınızın nedeni olabileceğini belirlemek için SQL kesinti güçlerinizi kullanmanız gerekecektir.

47
Dan Carley

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

show engine innodb status;

marko'nun bağlantısında belirtildiği gibi. Bu size kilitleme sorgusu, kaç satır/tablo tarafından kilitli olduğu vb. Verecektir. İŞLEMLER bölümüne bakın.

SHOW PROCESSLIST Kullanmayla ilgili sorun, diğer sorgular sıraya alınmadıkça kilitleri görmemenizdir.

26
Polymorphix

Deneyin SHOW OPEN TABLES :

show open tables where In_Use > 0 ;
24
M Sleman

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

Bunu örn. bir terminalde mysql.

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

Açıkçası yukarıdaki işlem bir kilit tutar, çünkü işlem hala aktiftir. Ama şu anda hiçbir sorgu devam etmiyor ve hiç kimse hiçbir yerde kilit beklemiyor (en azından).

INFORMATION_SCHEMA.INNODB_LOCKS boş, bu belgeler verilen bir anlam ifade ediyor, çünkü sadece bir işlem var ve şu anda kilit bekleyen kimse yok. Ayrıca INNODB_LOCKS zaten kullanımdan kaldırıldı.

SHOW ENGINE INNODB STATUS işe yaramaz: someTable hiç bahsedilmedi

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

Kullanabilirsiniz INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_history ve performance_schema.threads - etkin işlemlerin geçmişte diğer cevabım belirtildiği gibi yürüttüğü sorguları ayıklamak için, ancak someTable'in kilitli olduğunu görmek için herhangi bir yolla karşılaşmadım yukarıdaki senaryo.

Şimdiye kadar diğer cevaplardaki öneriler en azından yardımcı olmayacaktır.

Yasal Uyarı: Yüklü innotop'um yok ve rahatsız etmedim. Belki de işe yarayabilir.

11
Peter V. Mørch

Bu komutu kullanma

SHOW PROCESSLIST

tablolarda kilit edinilmiş işlem de dahil olmak üzere, şu anda çalışan tüm işlemleri gösterecektir.

7
Arie K

AFAIK MYSQL'de hala yerel bir yol yok, ama innotop kullanıyorum. Ücretsizdir ve diğer birçok işlevselliğe de sahiptir.

Ayrıca innotop aracını kullanma hakkında daha fazla bilgi için bu bağlantı konusuna bakın.

7
Marko Carter

Bu yayından alınan referans.

Aşağıdaki komut dosyasını 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
5
Anvesh