해결 방법 : 정상적인 Rollback 처리를 위해서 기다리는 걸 권장함
Lock이 해제 되지 않는 경우 처리 되는 사항
테이블이 Lock이 걸려서 특정 Row 또는 테이블을 수정할 수 없는 경우 일반적으로
Alter system kill session 'SID_no, SERIAL_no' ;
명령을 날려서 강제로 종료 하는 경우가 많음
그런데 이렇게 해도 해제가 되지 않고 오류메세지와 함께
'ORA-00031 : session marked for kill ' 이라는 메세지를 띄워주고 종료되어버림
물론 기다리면 해제되는 경우가 일반적이고 정상적인 Rollback 처리를 위해서는 기다리는 걸 권함
아래 rollback 중인 내용을 확인하는 방법
Undo 현재 사용량 확인
SQL>
col SID_SERIAL for a10
col ORAUSER for a10
col PROGRAM for a30
col UNDOSEG for a30
col undo for a10
SELECT TO_CHAR(s.sid)||',' ||TO_CHAR(s.serial#) sid_serial,
NVL(s.username, 'None') orauser,
s.program,
r.name undoseg,
t.used_ublk * TO_NUMBER(x.value)/1024||'K' "Undo"
FROM sys.v_$rollname r,
sys.v_$session s,
sys.v_$transaction t,
sys.v_$parameter x
WHERE s.taddr = t.addr
AND r.usn = t.xidusn(+)
AND x.name = 'db_block_size'
/
SID_SERIAL ORAUSER PROGRAM UNDOSEG Undo
---------- ---------- ------------------------------ ------------------------------ ----------
46,1127 JSH sqlplus@prsjedb2 (TNS V1-V3) _SYSSMU14_2585002358$ 65552K
현재 Rollback 진행률 확인
SQL>
col OPNAME for a10
col TARGET for a20
col SOFAR for 999999999
col UNITS for a10
select OPNAME,TARGET,SOFAR,TOTALWORK,UNITS,START_TIME,TIME_REMAINING, ELAPSED_SECONDS
from v$session_longops where username='JSH'
/
OPNAME TARGET SOFAR TOTALWORK UNITS START_TIM TIME_REMAINING ELAPSED_SECONDS
---------- -------------------- ---------- ---------- ---------- --------- -------------- ---------------
Table Scan JSH.MAXTEST 25397 25397 Blocks 02-JAN-19 0 36
Table Scan JSH.MAXTEST 25397 25397 Blocks 02-JAN-19 0 67
Oracle Database 10g에서는 transaction rollback이 수행될때 , 진행중인 transaction이
$SESSION_LONGOPS view에 event가 기록되어짐
이 view는 10g 이전 데이타베이스에도 존재하였지만, transaction을 rollback을 하는것은
기록하지 못했었음.
Rollback의 경우에 , 6초보다 길어지는 경우에 이 view에 기록되어짐
$SESSION_LONGOPS view는 모든 진행중인 작업에 대해 보여주는데, "Transaction Rollback"
이라고 기록되어진 OPNAME 컬럼을 통해 확인할수 있다.
각 컬럼 설명
TIME_REMAINING : 예상된 남겨진 시간을 보여준다. (초단위)
ELAPSED_SECONDS : 이제까지 수행한 시간을 보여준다. (초단위)
TOTALWORK : 수행하는 작업의 전체 양을 보여준다.
SOFAR : 이제까지 수행한 작업의 양을 보여준다.
UNITS : 작업한 양의 단위를 보여준다.
LAST_UPDATE_TIME : view의 내용이 현재것인지를 판단하게 한다.
그러나 어쩔 수 없이 강제 해제를 시켜야 한다면 다음과 같이 처리 하면 됨
# 리눅스/유닉스 계열
SQL>
SELECT
X.SID,
X.USERNAME,
X.OSUSER,
X.PROCESS AS FG_PID,
Y.SPID BG_PID
FROM V$SESSION X, V$PROCESS Y
WHERE X.PADDR = Y.ADDR
AND X.USERNAME IS NOT NULL
/
SID USERNAME OSUSER FG_PID BG_PID
---------- ------------------------------ ---------------------------------
27 SYS oracle 6124 18598
48 JSH oracle 5139 11271
45 SYS oracle 6124 9601
46 JSH oracle 11796 11809
해당 쿼리를 SYSTEM 계정에서 실행한 뒤 PID(PROCESSID)를 확인 후 시스템 접근 후 해당 프로세스를 종료 하면 됨
$ KILL -9 PID
원인 : kill 명령 후 트랜젝션 rollback 중이기 때문에 바로 kill 되지 않은 것
dml에 의해 lock 가 걸리고 해당 세션이 끊겼을때 rollback 중인 내용이 많을 때 발생
기다리면 해제되는 경우가 일반적이고 정상적인 Rollback 처리를 위해서는 기다리는 걸 권함
'ORACLE > Lock' 카테고리의 다른 글
| 세션 ID 로 LOCK 풀기 (0) | 2020.04.27 |
|---|


