Yanıtlar:
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.
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.
Deneyin SHOW OPEN TABLES:
show open tables where In_Use > 0 ;
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.
AFAIK, MYSQL'de hala yerel bir yol yok, ancak innotop kullanıyorum . Ücretsizdir ve birçok başka işlevselliğe de sahiptir.
Ayrıca innotop aracını kullanma hakkında daha fazla bilgi için bu bağlantıya bakın .
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