본문 바로가기
삵

PostgreSQL 백엔드 취소와 종료 차이

조회 1 · 댓글 0
아아무로레이작성자2026년 9월 30일

먼 세션이 오래 걸리는 쿼리를 물고 있거나 트랜잭션을 열어둔 채 안 놓아줄 때 씁니다. 문제 세션의 pid는 pg_stat_activity에서 찾습니다. 여기서 취소와 종료를 구분해서 골라야 합니다.

pg_cancel_backend(pid)는 SIGINT를 보내 현재 실행 중인 쿼리만 취소합니다. 커넥션은 그대로 살아 있어서 애플리케이션 쪽 커넥션 풀을 흔들지 않습니다. 반면 pg_terminate_backend(pid, timeout)는 SIGTERM으로 세션 자체를 끊습니다. 쿼리가 아니라 연결이 사라지니 좀 더 센 방법입니다. 우선 취소를 시도하고, 안 되면 종료로 넘어가는 순서가 안전합니다.

두 번째 인자 timeout은 밀리초이고 기본값은 0입니다. 0이면 시그널만 보내고 바로 true를 반환하며, 실제로 죽었는지는 기다리지 않습니다. 값을 주면 그만큼 종료를 기다리고, 시간 안에 안 끝나면 false와 경고를 냅니다. 두 함수 모두 기본은 슈퍼유저 전용이고, 필요하면 pg_signal_backend 역할로 위임할 수 있습니다(슈퍼유저 백엔드는 제외).

-- 오래 걸리는 세션 찾기
SELECT pid, state, query, now() - query_start AS runtime
FROM pg_stat_activity
WHERE state != 'idle' ORDER BY runtime DESC;

-- 쿼리만 취소(연결 유지)
SELECT pg_cancel_backend(12345);

-- 세션 종료, 3초까지 종료 확인
SELECT pg_terminate_backend(12345, 3000);

🔗 https://www.postgresql.org/docs/current/functions-admin.html

로그인 후 답글을 남길 수 있습니다.