Uzun süre 'idle in transaction' bekleyen oturumları toplu ve kontrollü sonlandır
PostgreSQLOturumKomut
-- 1) Önce kuru çalıştırma: kimler etkilenecek?
SELECT pid, usename, application_name, client_addr,
now() - state_change AS idle_for, left(query, 80) AS last_query
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'idle in transaction (aborted)')
AND now() - state_change > interval '15 minutes'
AND backend_type = 'client backend'
AND pid <> pg_backend_pid();
-- 2) Sonlandır; her süreç için çıkışını en fazla 5 sn bekle
SELECT pid, usename, now() - state_change AS idle_for,
pg_terminate_backend(pid, 5000) AS terminated
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'idle in transaction (aborted)')
AND now() - state_change > interval '15 minutes'
AND backend_type = 'client backend'
AND pid <> pg_backend_pid();Ne yapar?
Belirli süredir transaction'ı açık bırakıp boşta bekleyen oturumları önce listeler, ardından sonlandırır; timeout parametresi süreç gerçekten çıkana kadar (veya süre dolana kadar) bekler.
Ne zaman kullanılır?
Lock tutan unutulmuş oturumlar blocking yarattığında veya xmin horizon'u tutarak VACUUM'u engellediğinde acil müdahale için.
Dikkat
'idle in transaction' oturumda pg_cancel_backend işe yaramaz (iptal edilecek çalışan sorgu yoktur); pg_terminate_backend gerekir ve commit edilmemiş tüm değişiklikler rollback olur. Filtreyi usename/application_name ile daralt; replikasyon, yedekleme ve izleme oturumlarını hariç tut. Bağlantı havuzları sonlandırılan bağlantıyı yeniden açar. Süre dolarsa fonksiyon uyarı verip false döner. Kalıcı çözüm için rol bazında idle_in_transaction_session_timeout tanımla.
İ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üren ve 'idle in transaction' kalan transaction'ları bul