오라클 LOCK 걸린 개체 확인 및 LOCK 해제
오라클이나 다른 DBMS 제품을 사용하는 중에 LOCK 이 걸려본 경험은 다들 한두번씩 있을거라고 봅니다.
일반적으로 TOAD 나 ORANGE 같은 상용제품을 사용할 때는 모니터링툴이 있으니 바로 열어서 확인해볼수 있지만
SQL Developer 같은 무료제품을 사용할 때에는 어떻게 해야 하는지 알 수 없습니다.
사실 모니터링툴도 다 DBMS 에서 관리하고 있는 시스템인데 SQL 로 조회해보면 됩니다.
자주 사용하는 sql 정도는 몇개 저장해두고 사용하면 편하게 쓸 수 있습니다.
일단 LOCK 걸린 객체를 확인해보겠습니다.
1. lock 걸린 개체 확인
SELECT OBJECT_ID , SESSION_ID -- SID , ORACLE_USERNAME , OS_USER_NAME FROM V$LOCKED_OBJECT ; OBJECT_ID SESSION_ID ORACLE_USERNAME OS_USER_NAME ----------------------------------------------------------------- 163990 401 SCOTT js 163966 401 SCOTT js
이걸로는 자세한 내용을 아직 알기 어렵습니다.
그러면 다음으로 해당 sid 와 serial 번호로 락걸린 object name 을 확인해보겠습니다.
2. 해당 sid 와 serial 번호로 락걸린 object name 을 확인
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' ; SID SERIAL# OBJECT_NAME KILL_TASK ------------------------------------------------------------ 401 12761 EMP 401, 12761 401 12761 EMP 401, 12761
자 이제 뭔가 OBJECT_NAME 이 보이면서 이 TABLE이 LOCK 이 걸렸구나 라는것을 확인할 수 있습니다.
그럼 LOCK 이 걸린것은 확인했고 LOCK 을 해제하려면 어떻게 해야 할까요?
정답은 마지막에 SID 와 SERIAL# 로 조회된 NUMBER 로 해당되는 SESSION 을 KILL 시키면 됩니다.
3. sid 와 시리얼 번호로 세션 해제
ALTER SYSTEM KILL SESSION '401, 12761' ;
뒤에 입력된 숫자인 401, 12761 는 위에서 말씀드린 SID와 SERIAL# 에 대한 값입니다.
편하게 KILL_TASK 라는 값을 복사해서 사용할 수 있게 미리 만들어주었습니다.
( ALTER 명령은 별도의 COMMIT 이 필요없는거 다들 아시리라 생각합니다. )
이 단계까지 왔으면 LOCK 걸린 테이블의 SESSION 은 해제되었을 것이라고 봅니다.
그런데 위에서 조회된 세션이 단순히 LOCK 걸린것이 아니라 아직 작업중인 SQL 일수도 있다는 생각이 들수도 있습니다.
그럴때는 LOCK 을 발생시킨 SQL 이 뭔지 확인해볼수 있습니다.
4. 락 발생 사용자 및 OBJECT 조회 + 어떤 sql 를 실행중하여 lock 을 걸고 있는지 확인
SELECT DISTINCT T1.SESSION_ID , T2.SERIAL# , T4.OBJECT_NAME , T2.MACHINE , T2.TERMINAL , T2.PROGRAM , T3.ADDRESS , T3.PIECE , T3.SQL_TEXT FROM V$LOCKED_OBJECT T1 , V$SESSION T2 , V$SQLTEXT T3 , DBA_OBJECTS T4 WHERE 1=1 AND T1.SESSION_ID = T2.SID AND T1.OBJECT_ID = T4.OBJECT_ID AND T2.SQL_ADDRESS = T3.ADDRESS ORDER BY T3.ADDRESS, T3.PIECE ; SESSION_ID SERIAL# OBJECT_NAME MACHINE TERMINAL PROGRAM ADDRESS PIECE SQL_TEXT -------------------------------------------------------------------------------------------------------------------------------------------- 401 12761 EMP machine_com1 unknown JDBC Thin Client 230134658 0 INSERT /*+ APPEND */ INTO EMP 401 12761 EMP machine_com1 unknown JDBC Thin Client 230134658 1 , EMPNO 401 12761 EMP machine_com1 unknown JDBC Thin Client 230134658 2 , EMPNM 401 12761 EMP machine_com1 unknown JDBC Thin Client 230134658 3 , DEPTNO
위와 같이 조회되면 맨 우측에 SQL_TEXT 를 조회해보면 어떤 SQL 이 실행되었는지 알 수 있습니다.
이상으로 오라클 TABLE LOCK 조회 및 해제방법에 대해 알아보았습니다.
'IT > Oracle' 카테고리의 다른 글
오라클 SUBSTR 함수 문법과 예제로 마스터하기 (0) | 2017.07.13 |
---|---|
오라클 다양한 INSERT INTO 방법 (0) | 2017.07.03 |
오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 테이블 복원 (4) | 2017.06.24 |
오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 객체제거 (0) | 2017.06.23 |
오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에 있는 객체 조회 및 쿼리방법 (2) | 2017.06.22 |