PostgreSQL Deadlock İncelemesi
Deadlock sayaç ve loglarını birlikte okuyarak çakışan transaction ve nesneleri bulur; kilit sırası ve indeks tasarımıyla tekrarını önler.
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
- Uygulama SQLSTATE `40P01`, `deadlock detected` hatası alır; M9 deadlock sayacı artar.
- `pg_stat_database.deadlocks` zaman içinde artış gösterir (kümülatif sayaçtır).
2. Etki / Impact
PostgreSQL deadlock döngüsünü kırmak için transaction'lardan birini iptal eder; ilgili işlem retry etmezse kullanıcı işi başarısız olur. Çok sık döngü throughput'u düşürür.
3. Teşhis / Diagnosis
SELECT datname, deadlocks, stats_reset FROM pg_stat_database
WHERE datname = current_database();İki zaman örneği arasındaki farkı alın; reset sonrası sayaç düşebilir.
4. Müdahale / Response
CREATE INDEX CONCURRENTLY idx_child_parent_id ON public.child (parent_id);`CONCURRENTLY` transaction bloğu içinde çalıştırılamaz ve tamamlanmadan önce yeterli disk alanı gerekir.
5. Doğrulama / Verification
- Bir tam trafik döngüsü boyunca M9 artışı durur; uygulama 40P01 hata ve retry metriği normalleşir.
- Test ortamında eşzamanlı çakışma senaryosu tekrar denenir.
6. Geri Alma / Rollback
- Yeni indeks yanlış plan oluşturduysa ilgili indeks bakım penceresinde `DROP INDEX CONCURRENTLY public.idx_child_parent_id;` ile kaldırılabilir; kilit ve plan etkisini doğrulayın.
- Log/timeout ayarlarını önceki değerlerine döndürün; iptal edilmiş transaction'lar otomatik geri gelmez.