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

PostgreSQL Long and Idle-in-Transaction Sessions

Diagnoses open transactions by age, owner, locks and xmin, and safely resolves sessions blocking vacuum.

Related Metrics:M7
Related Scripts:S1S2
#idle-in-transaction#xact-age#vacuum#blocking

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

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

🟢 Read-Only1. 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;
🟢 Read-Only2. 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.
🟢 Read-Only3. `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. Remediation & Action Plan

🟡 Reversible1. İş sahibinden işlemin canlı veri taşıma/ödeme gibi kritik olup olmadığını doğrulayın; mümkünse uygulamadan COMMIT/ROLLBACK isteyin.
🟡 Reversible2. 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
🔴 HIGH RISK / IRREVERSIBLE3. 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
🟡 Reversible4. 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. Verification & Health Checks

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

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

More POSTGRESQL Runbooks