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.
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
- 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
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;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
SELECT pg_cancel_backend(12345); -- yalnızca active sorgu içinSELECT pg_terminate_backend(12345); -- PID'i yeniden doğrulayınALTER 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.
Mühendislik Triadı: Doğrudan Teşhis Scriptleri
Bu runbook kriz müdahalesinde darboğazı tespit etmek için önerilen hazır SQL / Shell scriptleri:
PostgreSQL'de Uzun Süren Sorguları ve Idle in Transaction Oturumlarını Bulma
Bir dakikadan uzun süredir çalışan sorguları, bekleme olaylarını ve vacuum'u engelleyen idle in transaction oturumlarını listeler. Performans olaylarında ilk bakılacak script'tir.
PostgreSQL Kilit Zinciri: Kim Kimi Blokluyor?
pg_blocking_pids ile bloklanan ve bloklayan oturumları, sorgularıyla ve bekleme süreleriyle eşleştirir. Zincirin kök nedenini saniyeler içinde gösterir.