pg_stat_activity — представление с одной строкой на каждое соединение к базе: кто подключён, что выполняет прямо сейчас и сколько это уже длится.

SELECT pid, state, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC;

Колонка state — главное, на что смотреть: active — запрос реально выполняется; idle — соединение открыто, но ничего не делает; idle in transaction — самое опасное значение, транзакция открыта и висит, держит блокировки и мешает autovacuum чистить мёртвые строки.

Долгий или зависший запрос снимается по pid, без перезапуска соединения приложения:

SELECT pg_cancel_backend(1234);    -- мягко: отменить запрос
SELECT pg_terminate_backend(1234); -- жёстко: оборвать соединение целиком

pg_cancel_backend — как Ctrl+C для запроса, pg_terminate_backend рвёт саму сессию: использовать, когда cancel не подействовал за разумное время.

#postgresql #sysadmin #database