InnoDB deadlock analizi ve tüm deadlock'ları loglama
MySQLPerformansKomut
-- Son deadlock: LATEST DETECTED DEADLOCK bolumu (yalniz en sonuncusu tutulur)
SHOW ENGINE INNODB STATUS\G
-- Toplam deadlock sayaci
SELECT NAME, COUNT FROM information_schema.INNODB_METRICS WHERE NAME = 'lock_deadlocks';
-- Tum deadlock'lari error log'a yaz (Note seviyesinde yazilir, verbosity 3 gerekir)
SET PERSIST innodb_print_all_deadlocks = ON;
SET PERSIST log_error_verbosity = 3;Ne yapar?
Deadlock'a giren iki transaction'ı, her birinin tuttuğu ve beklediği lock'u (index, lock_mode, kayıt) ve InnoDB'nin hangisini rollback ettiğini gösterir; sayaçla sıklık izlenir, error log ile geçmiş deadlock'lar kaybolmaz.
Ne zaman kullanılır?
Uygulama 1213 'Deadlock found when trying to get lock' hatası aldığında veya deadlock alarmı arttığında.
Dikkat
LATEST DETECTED DEADLOCK yalnız son olayı tutar ve restart'ta kaybolur. 'HOLDS THE LOCK(S)' / 'WAITING FOR THIS LOCK TO BE GRANTED' satırlarındaki index adı ve lock_mode (X, S, gap, insert intention) nedeni verir; 'WE ROLL BACK TRANSACTION (n)' kurbanı gösterir. Uygulama 1213'te transaction'ı baştan yeniden denemeli. Kalıcı çözüm: satırlara hep aynı sırayla erişmek, transaction'ları kısa tutmak, gap lock'u azaltmak için doğru index ve gerekiyorsa READ COMMITTED. log_error_verbosity=3 tüm Note mesajlarını da açar; error log büyümesini izle. Innodb_deadlocks status değişkeni MySQL Community'de yoktur; sayaç için INNODB_METRICS kullan.
İlgili
- En pahalı sorguları bul (performance_schema digest)
- Şu anda ne çalışıyor: aktif oturumlar, süre, lock ve transaction (sys.session)
- 'Waiting for table metadata lock' teşhisi ve asıl bloklayanı bulma
- Uzun açık transaction'lar ve history list length (purge gecikmesi)
- Slow log'u kısa süreli tam yakala ve pt-query-digest ile analiz et
- EXPLAIN ANALYZE ve optimizer trace ile kötü planı çöz