dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/postgresql/#9
Runbook #9
postgresql
LockingSEV2 · DEGRADATION15-30 dakika / 15-30 minssuperuser / postgres / rds_superuser

PostgreSQL Deadlock Investigation

Combines deadlock counters and logs to identify conflicting transactions and objects, then prevents recurrence through lock ordering and index design.

Related Metrics:M9
Related Scripts:S2S17
#deadlock#40P01#log_lock_waits#foreign-key

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Symptom & Signals

- 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. Business & Technical 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. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. Sayaç farkını ölçün:
sql
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.

🟢 Read-Only2. PostgreSQL logunda `deadlock detected` için `DETAIL: Process ... waits for ...; blocked by ...` ve `CONTEXT` satırlarını toplayın. Deadlock çözüldükten sonra S2 boş dönebilir: geçmiş döngü `pg_stat_activity` ile yeniden oluşturulamaz. `log_line_prefix` içinde PID ve transaction ID olduğundan emin olun.
🟢 Read-Only3. Etkilenen tablolar, transaction sırası, satır güncelleme sırası ve DDL/FK kontrolünü çıkarın. S17 FK sütunlarında destekleyici indeks bulunup bulunmadığını inceleyin. FK indeksi her zaman kök neden değildir; uygulama sorgusu ve planıyla doğrulayın.

4. Remediation & Action Plan

🟡 Reversible1. Uygulamada yalnızca **SQLSTATE 40P01** için transaction'ın **tamamını** (tek statement değil) sınırlı sayıda, jitter'lı geri çekilme ile yeniden deneyin. İşlemlerin idempotent olduğunu doğrulayın.
🟡 Reversible2. Çakışan kod yollarında tabloları ve satırları **her zaman aynı sırayla** kilitleyin, transaction'ları kısaltın. `SELECT ... FOR UPDATE` kullanıyorsanız sıralamayı uygulama düzeyinde tutarlı hale getirin.
🟡 Reversible3. İhtiyaç duyulan FK indeksini iş yüküyle doğrulayıp uygun bakım penceresinde ekleyin:
sql
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.

🔴 HIGH RISK / IRREVERSIBLE4. **`deadlock_timeout` değerini körlemesine düşürmeyin veya artırmayın:** bu deadlock'un tespit/rapor hızını değiştirir, kök kilit döngüsünü çözmez. Yalnızca geçici tanılama gerekiyorsa `log_lock_waits = on` değerini kontrollü açın, log hacmini izleyin.

5. Verification & Health Checks

- 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. Rollback & Contingency Plan

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

More POSTGRESQL Runbooks