Blocking ağacını çıkar (kök bloklayan oturumu bul)
PostgreSQLOturumKomut
WITH RECURSIVE tree AS (
SELECT a.pid, a.pid AS root_pid, 0 AS level, ARRAY[a.pid] AS path
FROM pg_stat_activity a
WHERE cardinality(pg_blocking_pids(a.pid)) = 0
AND EXISTS (SELECT 1 FROM pg_stat_activity w WHERE a.pid = ANY (pg_blocking_pids(w.pid)))
UNION ALL
SELECT w.pid, t.root_pid, t.level + 1, t.path || w.pid
FROM tree t
JOIN pg_stat_activity w ON t.pid = ANY (pg_blocking_pids(w.pid))
WHERE w.pid <> ALL (t.path)
), node AS (
SELECT DISTINCT ON (pid) pid, root_pid, level
FROM tree
ORDER BY pid, level DESC
)
SELECT repeat(' ', n.level) || n.pid AS pid_tree,
n.root_pid,
pg_blocking_pids(n.pid) AS blocked_by,
a.usename,
a.state,
a.wait_event_type || ':' || a.wait_event AS wait,
now() - a.xact_start AS xact_age,
left(regexp_replace(a.query, '\s+', ' ', 'g'), 80) AS query
FROM node n
JOIN pg_stat_activity a USING (pid)
ORDER BY n.root_pid, n.level, n.pid;Ne yapar?
pg_blocking_pids() ile bekleme zincirini özyinelemeli izler; kimseyi beklemeyen kök bloklayıcıdan başlayarak her bekleyen oturumu girintili ağaç halinde, onu doğrudan bloklayan PID'ler ve transaction yaşıyla gösterir.
Ne zaman kullanılır?
Uygulamada toplu zaman aşımı veya kuyruk birikmesi olduğunda; onlarca bekleyen oturum içinden müdahale edilmesi gereken tek kök oturumu bulmak için.
Dikkat
Kök çoğu zaman lock'u tutup unutulmuş 'idle in transaction' bir oturumdur; query sütunu o oturumun lock'u alan komutunu değil SON çalıştırdığı komutu gösterir. ACCESS EXCLUSIVE bekleyen bir DDL, lock kuyruğu nedeniyle arkasındaki basit SELECT'leri de bloklar ve ağaçta ara düğüm olarak görünür. pg_blocking_pids() lock manager üzerinde kısa süreli lock alır; bu sorguyu sık aralıklı döngüyle çalıştırma. Bir oturum birden çok kola bağlıysa en derin seviyesinde bir kez gösterilir.
İlgili
- Backend'i sonlandır (pg_terminate_backend)
- Çalışan sorguyu iptal et (pg_cancel_backend)
- Aktif ve bloklayan sorguları gör
- 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
- Uzun süre 'idle in transaction' bekleyen oturumları toplu ve kontrollü sonlandır