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 Locked
ve 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 PROCESSLIST
diğ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_LOCKS
dokü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_LOCKS
yine de kullanımdan kaldırıldı.
SHOW ENGINE INNODB STATUS
yararsızdır: someTable
hiç 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_history
ve performance_schema.threads
belirtilen 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 someTable
yukarı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