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

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.

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:

Tüm Scriptler (100)
#1 · SQLPerformance

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.

#2 · SQLLocking

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.

Tetikleyen Alarmlar ve Metrikler
M7PostgreSQL En Uzun Transaction YaşıPostgreSQL

Diğer POSTGRESQL Runbook'ları