DBAtlas · Veritabanı operasyon atlası

InnoDB deadlock analizi ve tüm deadlock'ları loglama

MySQLPerformans

Komut

-- 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.

DBAtlas'ta aç →

İlgili