MySQL InnoDB Lock Wait Timeout: Bloklayıcıyı Bulma ve Çözme
ERROR 1205 ve satır kilidi beklemelerinde bekleyen ile bloklayan transaction'ı eşleştirir; müdahale ve tekrarını önleme adımlarını açıklar.
Operasyonel Güvenlik ve Risk Uyarısı
Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.
1. Belirti / Symptom
- `ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction`, M20 artışı.
- Çok sayıda kısa sorgu aynı tabloda bekler. `ERROR 1213` bir **deadlock**'tur ve farklı teşhis gerektirir.
2. Etki / Impact
İşlem zaman aşımına uğrar; MySQL varsayılanında timeout alan **statement** geri alınır, tüm transaction otomatik rollback olmayabilir (`innodb_rollback_on_timeout` ayarına bağlı). Uygulama hatalı biçimde devam ederse kısmi iş mantığı oluşabilir.
3. Teşhis / Diagnosis
SELECT wait_started, wait_age, locked_table, locked_index,
waiting_pid, LEFT(waiting_query,160) AS waiting_sql,
blocking_pid, LEFT(blocking_query,160) AS blocking_sql
FROM sys.innodb_lock_waits ORDER BY wait_age DESC;`blocking_query` boş olabilir: oturum Sleep durumunda açık transaction tutuyordur.
SELECT trx_mysql_thread_id AS pid, trx_started, trx_state,
trx_rows_locked, trx_rows_modified, LEFT(trx_query,160) AS query_text
FROM information_schema.innodb_trx ORDER BY trx_started;4. Müdahale / Response
5. Doğrulama / Verification
- S22 bekleme listesi temizlenir, M20 normalleşir; uygulama işlemleri ve satır sayısı/tutarlılık kontrolü başarılıdır.
- 1205 ve deadlock sayıları ayrı ayrı izlenir; değişiklik sonrası regresyon yoktur.
6. Geri Alma / Rollback
- Sonlandırılan transaction geri gelmez, uygulama kontrollü yeniden denemelidir; indeks veya zaman aşımı ayarını planlı olarak eski değerine alın.
- Olay anında zorla yapılan COMMIT/ROLLBACK geri alınamaz; iş verisini doğrulayın.