<Lock걸린 부분이 있는지 확인>
SELECT C.OBJECT_NAME
, B.SID
, B.SERIAL#
, 'ALTER SYSTEM KILL SESSION '''||B.SID||','||B.SERIAL#||''';'
FROM V$LOCKED_OBJECT A
JOIN V$SESSION B ON ( A.SESSION_ID = B.SID )
JOIN DBA_OBJECTS C ON ( A.OBJECT_ID = C.OBJECT_ID );
위 쿼리로 세션을 Kill
<만약 Lock 내역이 보이지 않는다면>
SELECT A.LOCK_ID1
, A.SESSION_ID
, 'ALTER SYSTEM KILL SESSION '''||B.SID||','||B.SERIAL#||''';'
FROM DBA_LOCK_INTERNAL A
JOIN V$SESSION B ON ( A.SESSION_ID = B.SID )
WHERE LOCK_ID1 LIKE '%object_name%'; --> Object Name 입력
- Lock이 걸린 것으로 의심되는 object의 이름을 넣어 위 쿼리로 확인
- 내역이 보이면 세션을 Kill 시킨다.
<하지만 여전히 세션 내역에 존재하고>
SELECT STATUS
FROM V$SESSION
WHERE SID = 'session_id'; --> Session ID 입력
위 쿼리의 결과(STATUS)가 'Killed'라고 나온다면
<서버에서 돌고있는 Lock 관련 프로세스 확인>
SELECT B.SPID
, 'KILL -9 ' || B.SPID
FROM V$SESSION A
JOIN V$PROCESS B ON ( A.PADDR = B.ADDR )
WHERE A.SID = 'session_id'; --> Session ID 입력
<프로세스 ID가 실제 존재하는지 서버에서 확인>
ps -ef | grep 프로세스ID
<서버 프로세스 kill>
#DB서버
kill -9 프로세스ID
Kill 후 쿼리로 세션 존재여부 확인
끝.