오라클(Oracle) 락(Lock) 개체 확인 및 락해제 방법

오라클(Oracle) 락(Lock) 개체 확인 및 락해제 방법

오라클 프로그램을 사용하다 보면 통계성의 테이터 조회를 하거나 대용량의 데이터를 업데이트 하기도 합니다. 오라클은 많은 데이터를 한번에 처리하는것이 아니라 commit 전까지 데이터를 가지고 있다가 commit 이나 rollback이 일어나면 그 때 처리하는 겁니다.

실무에서는 이런 일이 상당히 많이 있는데요. 일부 운영데이터를 개발데이터로 이관 시 이런 문제가 발생하기도 하지요

그러다 보니 lock이 걸리기도 하는데요. 어떤 부분에서 lock이 걸리는지 확인 후 걸린 개체를 해체시켜야 합니다.

이번 시간은 오라클(Oracle) 락(Lock) 개체 확인 및 락해제 방법을 알아보겠습니다.  

오라클(Oracle) 락(Lock) 개체 확인 및 락해제 방법


 

락개체를 조회하기 위해 V$LOCKED_OBJECT 시스템 테이블을 이용합니다.

SID 와 SERIAL#를 확인해서 어떤 테이블에 어떤 세션이 잡고 있는지 확인합니다.

SELECT A.SID
     , A.SERIAL#
     , OBJECT_NAME
     , A.SID || ', ' || A.SERIAL# AS KILL_TASK
  FROM V$SESSION   A
 INNER JOIN V$LOCK B
    ON A.SID   = B.SID
 INNER JOIN DBA_OBJECTS C
    ON B.ID1   = C.OBJECT_ID
 WHERE B.TYPE  = 'TM'

 ;  

 

조회가 되면 MEBMER_TEST 테이블에 락이 걸린것을 확인할 수 있습니다.

락해제는 SID와 SERIAL#번호로 확인할 수 있는데요

SID와 SERIAL#번호로


 

락이 걸린 SID와 SESSION 의 세션을 죽이면 되는데요

명령어는 다음과 같습니다.

ALTER SYSTEM KILL SESSION '[SID], [SESSION]';

 

ALTER SYSTEM KILL SESSION '231, 13515';

 

이렇게 되면 락이 걸린 세션이 죽게되어 락해제가 됩니다.

오라클 락해제 쿼리


 

어떤 SQL 때문에 해당 TABLE에 LOCK이 걸린것인지 확인할수 있는데요

SELECT DISTINCT A.SESSION_ID
     , B.SERIAL#
     , D.OBJECT_NAME
     , B.MACHINE
     , B.TERMINAL
     , B.PROGRAM
     , C.ADDRESS
     , C.PIECE
     , C.SQL_TEXT
  FROM V$LOCKED_OBJECT A
     , V$SESSION B
     , V$SQLTEXT C
     , DBA_OBJECTS D
 WHERE 1=1
   AND A.SESSION_ID  = B.SID
   AND A.OBJECT_ID   = D.OBJECT_ID
   AND B.SQL_ADDRESS = C.ADDRESS
   ORDER BY C.ADDRESS, C.PIECE   ;
    

 

쿼리를 실행하면 어떤 SQL 이 문제가 되고 어떤 테이블에 문제가 있는지 확인할 수 있습니다.

LOCK 테이블 및 쿼리 조회

이상 오라클(Oracle) 락(Lock) 개체 확인 및 락해제 방법을 알아보았습니다.