본문 바로가기
IT만들기/Database

오라클(oracle) 락(lock - 세션, 로우) 확인 및 락 걸린 세션 제거(kill)

by 커피향처럼 2021. 1. 8.

오라클에서 UPDATE 문을 실행하면 COMMIT, ROLLBACK 문을 실행하기 전에는 로우 락이 걸립니다.
로우 락이 걸리면 다른 사용자는 해당 데이터를 수정 할 수 없게 됩니다.
종종 토드(TOAD) 등의 툴에서 DB 작업을 하다보면 커밋 또는 롤백 하기 전에 프로그램이 갑자기 죽어버려서 세션이 끊기지 않은 상태로 되어 로우 락이 걸리는 경우가 있습니다.
아래에 참조 쿼리를 나열해 봤습니다. 
실제 락을 푸는 쿼리는 마지막 쿼리를 봐주세요.
아래의 쿼리를 실행하고 락을 풀기 위해서는 관리자 DBA 권한이 있어야 합니다.

  • 락 걸린 테이블 확인하는 쿼리
SELECT
  dbo.object_name
  ,dbo.owner
  ,dbo.object_type
  ,vlo.xidusn
  ,vlo.session_id
  ,vlo.locked_mode
FROM V$LOCKED_OBJECT vlo, DBA_OBJECTS dbo
WHERE vlo.object_id = dbo.object_id;

 

  • 특정 테이블이 락 걸렸는지 확인하는 쿼리
SELECT
  vs.sid
  ,vs.serial#
  ,vl.type
  ,dbo.object_name
FROM V$SESSION vs, V$LOCK vl, DBA_OBJECTS dbo
WHERE vs.sid = vl.sid
  AND vl.id1 = dbo.object_id
  AND vl.type = 'TM' 
  AND dbo.object_name IN ('테이블명');

 

락을 발생한 사용자와 실행 SQL, OBJECT 조회

SELECT DISTINCT
  x.session_id
  ,a.serial#
  ,d.object_name
  ,a.machine
  ,a.terminal
  ,a.program,
  ,b.address
  ,b.piece
  ,b.sql_text
FROM V$LOCKED_OBJECT x, V$SESSION a, V$SQLTEXT b, DBA_OBJECTS d
WHERE x.session_id = a.sid
  AND x.object_id = d.object_id
  AND a.sql_address = b.address
ORDER BY b.address, b.piece;
  

 

  • 락 걸린 사용자 제거(kill) 실행문 추출 쿼리 
SELECT DISTINCT
  'ALTER SYSTEM KILL SESSION ''' || a.sid ||', ' || a.serial# || ''';'
FROM gv$locked_object x, gv$session a, dba_objects d
WHERE x.session_id = a.sid and x.object_id = d.object_id
;

바로 위의 이 쿼리로 세션 킬하는 쿼리문을 추출하여 다음과 같은 형식의 쿼리를 실행하여 락을 해제하면 됩니다.

ALTER SYSTEM KILL SESSION '26, 6044';

댓글