Uzun süren ve 'idle in transaction' kalan transaction'ları bul
PostgreSQLOturumKomut
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.
İlgili
- Backend'i sonlandır (pg_terminate_backend)
- Çalışan sorguyu iptal et (pg_cancel_backend)
- Aktif ve bloklayan sorguları gör
- Blocking ağacını çıkar (kök bloklayan oturumu bul)
- Bekleyen lock'ları nesne ve lock modu düzeyinde ayrıntılı gör (pg_locks)
- Uzun süre 'idle in transaction' bekleyen oturumları toplu ve kontrollü sonlandır