Cards → Modals. Focus “actions DBA” : EXPLAIN (ANALYZE, BUFFERS), blocages, décisions cancel vs terminate, et scénario minute par minute.
Lire un plan, détecter rows est/act, spill temp, join explosif, buffers.
Checklist, arbre de décision, pg_cancel_backend vs pg_terminate_backend.
Incident type : DDL bloquant + pile de sessions + ralentissement global.
SELECT pid, usename, now()-query_start AS duration, state, query
FROM pg_stat_activity
WHERE state='active'
ORDER BY duration DESC
LIMIT 10;EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS)
SELECT ...;SELECT pid, usename, state, now()-xact_start AS xact_duration, query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_duration DESC;SELECT pg_cancel_backend();
SELECT pg_terminate_backend();
SELECT
a.pid AS blocked_pid,
a.query AS blocked_query,
b.pid AS blocking_pid,
b.query AS blocking_query,
now() - b.query_start AS blocking_for
FROM pg_stat_activity a
JOIN pg_locks la ON la.pid = a.pid AND NOT la.granted
JOIN pg_locks lb ON lb.locktype = la.locktype
AND lb.database IS NOT DISTINCT FROM la.database
AND lb.relation IS NOT DISTINCT FROM la.relation
AND lb.page IS NOT DISTINCT FROM la.page
AND lb.tuple IS NOT DISTINCT FROM la.tuple
AND lb.transactionid IS NOT DISTINCT FROM la.transactionid
AND lb.classid IS NOT DISTINCT FROM la.classid
AND lb.objid IS NOT DISTINCT FROM la.objid
AND lb.objsubid IS NOT DISTINCT FROM la.objsubid
AND lb.pid <> la.pid
JOIN pg_stat_activity b ON b.pid = lb.pid;Règle terrain : commencer par cancel. N’utiliser terminate que si prod en danger + justification claire (impact, blocage, saturation).
SELECT pid, usename, now()-query_start AS dur, state, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY dur DESC
LIMIT 15;-- Utilise la requête blocked/blocking de la modal 2
-- Objectif : trouver le bloqueur racine (root blocker).