개발/데이터베이스

PostgreSQL 락(lock) 프로세스 확인 및 강제 종료(kill)

피터JK 2025. 4. 8. 10:55
728x90

락을 강제로 해제하려면 해당 락을 걸고 있는 프로세스를 강제 종료(kill) 해야 합니다. PostgreSQL에서는 pg_terminate_backend() 함수를 사용해 이를 수행할 수 있습니다.

다음 절차에 따라 진행하면 됩니다:


1. 락 걸린 프로세스 확인

SELECT 
    pg_stat_activity.pid,
    pg_stat_activity.usename,
    pg_stat_activity.query,
    pg_stat_activity.state,
    pg_stat_activity.query_start
FROM pg_locks
JOIN pg_stat_activity 
    ON pg_locks.pid = pg_stat_activity.pid
WHERE pg_locks.locktype = 'relation'
  AND pg_locks.relation = 'my_table'::regclass;

 

2. 락 + 사용자 + 쿼리 확인 쿼리

SELECT 
    pg_stat_activity.pid,
    pg_stat_activity.usename AS username,
    pg_stat_activity.application_name,
    pg_stat_activity.client_addr,
    pg_stat_activity.state,
    pg_stat_activity.query,
    pg_stat_activity.query_start,
    pg_locks.locktype,
    pg_locks.mode,
    pg_locks.granted,
    pg_locks.relation::regclass AS table_name
FROM pg_locks
JOIN pg_stat_activity 
    ON pg_locks.pid = pg_stat_activity.pid
WHERE pg_locks.locktype = 'relation'
  AND pg_locks.relation = 'my_table'::regclass  -- 특정 테이블 락만 조회
ORDER BY pg_stat_activity.query_start;

예시 결과

pid username client_addr query_start table_name mode granted
12345 dev_user 192.168.0.5 2025-04-07 10:15:00 my_table RowExclusiveLock t

이렇게 나오면, dev_user라는 사용자가 my_table에 락을 걸고 있다는 걸 알 수 있다.

728x90

3. 해당 프로세스 강제 종료

SELECT pg_terminate_backend(<PID>);

<PID>는 위에서 조회된 pg_stat_activity.pid 값을 넣습니다.

예를 들어 PID가 12345라면:

SELECT pg_terminate_backend(12345);

주의사항

  • 데이터 손실 위험: 해당 프로세스가 트랜잭션 중이라면 롤백이 발생
  • DBA나 운영자와 협의 후 사용하세요.
  • 사용자의 중요한 작업을 중단시킬 수 있다.

 

728x90