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;