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
'개발 > 데이터베이스' 카테고리의 다른 글
| PostgreSQL(FDW) -> Oracle DB를 foreign table로 연결 사용 (0) | 2025.04.16 |
|---|---|
| PostgreSQL FDW (Foreign Data Wrapper) foreign table 생성 방법 (0) | 2025.04.16 |
| PostgreSQL에서 WITH ... AS MATERIALIZED 물리적 임시저장 (0) | 2025.03.18 |
| Postgresql 테이블스페이스 생성 관리 (0) | 2025.03.17 |
| PostgreSQL 속도 문제 원인 및 해결 방법 (0) | 2025.03.12 |