[PostgreSQL] Lock 이 걸린 process 조회 및 종료하는 법

식빵·2023년 8월 25일
0

postgresql-memo

목록 보기
30/34
post-thumbnail

🔍 Lock 걸린 pid 찾는법

select pid,
       usename,
       application_name,
       pg_blocking_pids(pid) as blocked_by,
       query as blocked_query,
       backend_start, 
       query_start,
       backend_type
from pg_stat_activity
where cardinality(pg_blocking_pids(pid)) > 0;
  • 쿼리 결과로 나오는 pid (=프로세스 ID)를 모두 terminate 시키면 됩니다.
  • 개인적으로는 application_name 도 한번 확인하면서 지울 타겟을 지정하는 걸 추천합니다.
  • 고의적으로 긴 lock 을 걸 수 밖에 없는 경우가 있어서 그렇습니다.




☠️ Process Terminate 하는 법

1. 구분없이 모두 Terminate

application_name 신경쓰지 않고 한방에 다 Lock 걸린 애들을 Terminate 시키려면
아래와 같은 방법을 사용합니다.

SELECT pg_cancel_backend(a.pid), pg_terminate_backend(a.pid)
FROM( select pid
      from pg_stat_activity
      where cardinality(pg_blocking_pids(pid)) > 0) a
where a.pid <> pg_backend_pid() -- 자기 connection 은 끊지 않기

2. 특정 pid 선정해서 Terminate

SELECT 
	pg_cancel_backend(pid), -- 해당 PID만 중지
	pg_terminate_backend(pid) -- 혹시 모르니, PID와 연계된 모든 상위 쿼리 프로세스도 종료
FROM pg_stat_activity 
where 
pid <> pg_backend_pid() -- 현재 이 쿼리르 돌리는 session 의 pid 는 끊지 않음
and backend_type = 'client backend' -- 내부적으로 사용되는 pid 는 죽이지 않기 위함
and pid in (1826,5123,5132,61112)  -- 여기서 죽이고 싶은 pid 를 지정!



참고 링크:

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글