dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #8
postgresql
AvailabilitySEV2 · CİDDİ BOZULMA15-30 dakika / 15-30 minssuperuser / postgres / rds_superuser

PostgreSQL Uzun ve Idle-in-Transaction Oturumlar

Açık transaction'ları yaş, kullanıcı, kilit ve xmin bağlamında teşhis eder; vacuum'u engelleyen oturumları kontrollü biçimde sonlandırır.

İlişkili Metrik:M7
İlişkili Script:S1S2
#idle-in-transaction#xact-age#vacuum#blocking

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.

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

1. Belirti / Symptom

- M7 en eski transaction yaşı > 5 dakika; oturumlar `idle in transaction` durumunda saatlerce kalır.

- Dead tuple artışı, kilit beklemeleri veya WAL tutulması aynı dönemde yükselir.

2. Etki / Impact

MVCC temizliği gecikir, bloat ve XID riski büyür. Oturum kilit tutuyorsa diğer sorguları bloklar. Her uzun transaction aynı ölçüde sorun yaratmaz; `backend_xmin` ve kilit durumunu doğrulayın.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. S1 ile transaction'ları ve sahiplerini listeleyin:
sql
SELECT pid, usename, application_name, client_addr, state,
       now() - xact_start AS xact_age, backend_xmin,
       wait_event_type, wait_event, left(query, 180) AS last_query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL AND pid <> pg_backend_pid()
ORDER BY xact_start;
🟢 Salt Okunur2. S2 ile bu PID'lerin başkalarını bloklayıp bloklamadığını kontrol edin. `pg_stat_activity.query` idle oturumda **son çalıştırılan sorgudur**, şu an çalışan komut değildir.
🟢 Salt Okunur3. `backend_xmin` null olabilir; tek başına bu alanın boşluğu tüm riski dışlamaz. Prepared transaction ve replikasyon slotlarını da görün:
sql
SELECT gid, prepared, owner, database FROM pg_prepared_xacts ORDER BY prepared;
SELECT slot_name, xmin, catalog_xmin FROM pg_replication_slots;

4. Müdahale / Response

🟡 Geri Alınabilir1. İş sahibinden işlemin canlı veri taşıma/ödeme gibi kritik olup olmadığını doğrulayın; mümkünse uygulamadan COMMIT/ROLLBACK isteyin.
🟡 Geri Alınabilir2. Aktif uzun sorguyu öncelikle iptal edin; `idle in transaction` için iptal etme işe yaramaz, çünkü o anda çalışan sorgu yoktur:
sql
SELECT pg_cancel_backend(12345); -- yalnızca active sorgu için
🔴 YÜKSEK RİSK / GERİ ALINAMAZ3. Sahibinden onayla gerçekten unutulmuş idle transaction'ı sonlandırın. Açık transaction geri alınır ve tekrar eden iş yeniden denemelidir:
sql
SELECT pg_terminate_backend(12345); -- PID'i yeniden doğrulayın
🟡 Geri Alınabilir4. Tekrarlamayı önlemek için uygulamada her transaction'ı `try/finally` ile kapatın. Rol bazında, yeniden bağlanan oturumlara uygulanacak timeout:
sql
ALTER ROLE uygulama_rolu SET idle_in_transaction_session_timeout = '5min';

PG 9.6+; iş yüküne uygun değer seçin. PG 14+ `idle_session_timeout` **yalnızca** transaction dışı idle oturumlar içindir.

5. Doğrulama / Verification

- M7 düşüyor; aynı rol/uygulama kaynaklı uzun transaction tekrarlamıyor.

- S2 bloklayıcı zinciri boş, vacuum yeniden ilerliyor; uygulamada başarısız transaction sayısı yükselmiyor.

6. Geri Alma / Rollback

- Sonlandırılan transaction geri döndürülemez; uygulamada yeniden başlatılmalıdır.

- Timeout değişikliğini `ALTER ROLE uygulama_rolu RESET idle_in_transaction_session_timeout;` ile kaldırın; mevcut oturumlarda etkin ayar ayrıca kontrol edilmelidir.

Diğer POSTGRESQL Runbook'ları