DB
DB Lock 조회 및 PID 중지
행복 개발자
2021. 10. 2. 01:07
-- 실행중인 쿼리 runtime 추가
SELECT datid, pid,
current_timestamp - query_start AS runtime,
datname, usename, query
FROM pg_stat_activity
WHERE state = 'active'
--AND current_timestamp - query_start > '1 min'
ORDER BY 3 DESC;
-- 1)실행중인 전체 쿼리 확인
SELECT pid, query, * FROM pg_stat_activity
where state = 'active'
ORDER BY query_start ASC;
-- 2) 현재 테이블에 Lock을 확인하는 쿼리
-- RowExclusiveLock같은것이 검색되면 다른 쿼리에도 영향을 주는 놈임
-- 아직 테스트를 못해봤으니 여기서 나오는 pid를 1)번에 조건을 걸어서 어떤 query인지 확인이 필요하다.
SELECT t.relname,
l.locktype,
page,
virtualtransaction,
pid,
mode,
granted
FROM pg_locks l,
pg_stat_all_tables t
WHERE l.relation = t.relid
ORDER BY relation ASC;
-- 3) rowshare Lock 조회: 특정 로우에 락이 걸린 경우 조회, 이경우 아래 2차 시도 쿼리를 실행해야 한다.
select locktype, relation::regclass, mode, transactionid tid, pid, granted from pg_catalog.pg_locks where not pid=pg_backend_pid();
-- 1) 1차 : 해당 pid만 중지
select pg_cancel_backend(4678249);
-- 2) 2차 : 해당 PID와 연계된 모든 상위 Query Process를 모두 중지시킵니다.
--- 따라서 pg_cancel_backend로 해당 작업이 중지되는지 먼저 확인해 보고,
--- 그래도 안된다면 pg_terminate_backend를 수행해 보시면 됩니다
SELECT pg_terminate_backend(32519) FROM pg_stat_activity;