DBAtlas · Veritabanı operasyon atlası

Uzun süren ve 'idle in transaction' kalan transaction'ları bul

PostgreSQLOturum

Komut

SELECT pid,
       usename,
       datname,
       application_name,
       client_addr,
       state,
       now() - xact_start AS xact_age,
       now() - state_change AS in_state_for,
       backend_xid,
       age(backend_xmin) AS xmin_age,
       left(regexp_replace(query, '\s+', ' ', 'g'), 100) AS last_query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
  AND backend_type = 'client backend'
  AND pid <> pg_backend_pid()
  AND (now() - xact_start > interval '5 minutes' OR state LIKE 'idle in transaction%')
ORDER BY xact_start;

Ne yapar?

Açık transaction'ı 5 dakikadan eski olan veya transaction açıkken boşta bekleyen oturumları; transaction yaşını, mevcut durumda geçen süreyi, atanmış XID'i ve tuttuğu xmin'in yaşını gösterir.

Ne zaman kullanılır?

Bloat arttığında, VACUUM 'dead row versions cannot be removed yet' raporladığında, lock beklemelerinde veya bağlantı havuzu sızıntısı şüphesinde.

Dikkat

Uzun transaction'lar (özellikle REPEATABLE READ/SERIALIZABLE veya açık cursor tutanlar) backend_xmin ile VACUUM'un temizleme sınırını (xmin horizon) geride tutar; bu tüm veritabanında bloat ve XID yaşlanmasına yol açar. 'idle in transaction (aborted)' hata almış ve ROLLBACK bekleyen oturumdur. Kalıcı çözüm: rol bazında idle_in_transaction_session_timeout ve uygulamada transaction sınırlarının düzeltilmesi.

DBAtlas'ta aç →

İlgili