10.2.0.3 DB를 Shutdown immediate로 수행 시 Shutdown이 오래걸려 Alter log를 확인하였습니다.
Alter log에 'Waiting for smon to disable tx recovery.' 메세지가 로깅되어 있었고, 이 메세지 로깅 시간의 한참후에 DB가 Shutdown 되었습니다.
그래서 어떤 상황일 때 메세지가 발생하는지 정리해보려고 합니다.
원인 : DB를 Shutdown 시키거나, 프로세스를 종료 시, Large Transaction이 종료된 후 데이터베이스가 중단된 것처럼보이지만, SMON 백그라운드 프로세스가 사실은 사용가능한 모든 CPU를 사용하고 있습니다.
기본적으로 SMON 프로세스는 대규모 트랜잭션을 롤백하는 중이고, 이 때 시간이 많이 걸릴수 있습니다.
Shutdown immediate시 Hang 걸린것처럼 보이는 이 현상을 기다리지 않고 Abort처럼 비정상적으로 종료하게 된다고 해서 SMON이 수행해야 하는 롤백 트랜잭션의 양은 줄어들지 않습니다. 따라서 비정상적으로 종료하는것보다 SMON이 정상적으로 롤백업무를 다 수행하도록 대기하는것이 좋습니다.
먼제 SMON이 진행하고있는 상황을 파악해야합니다.
SELECT r.NAME "RB Segment Name", dba_seg.size_mb,
DECODE(TRUNC(SYSDATE - LOGON_TIME), 0, NULL, TRUNC(SYSDATE - LOGON_TIME) || 'Days' || '+') || TO_CHAR(TO_DATE(TRUNC(MOD(SYSDATE-LOGON_TIME,1) * 86400), 'SSSSS'), 'HH24:MI:SS') LOGON, v$session.SID, v$session.SERIAL#, p.SPID, v$session.process, v$session.USERNAME, v$session.STATUS, v$session.OSUSER, v$session.MACHINE, v$session.PROGRAM, v$session.module, action
FROM v$lock l, v$process p, v$rollname r, v$session, (SELECT segment_name, ROUND(bytes/(1024*1024),2) size_mb FROM dba_segments WHERE segment_type = 'TYPE2 UNDO' ORDER BY bytes DESC) dba_seg WHERE l.SID = p.pid(+) AND v$session.SID = l.SID AND TRUNC (l.id1(+)/65536)=r.usn AND l.TYPE(+) = 'TX' AND l.lmode(+) = 6 AND r.NAME = dba_seg.segment_name AND v$session.username = 'SYSTEM' AND status = 'INACTIVE' ORDER BY size_mb DESC;
아래의 쿼리를 통해 TOTAL 블록수와 수행한 BLOCK 수행해야 할 BLOCK을 확인할 수 있습니다.
즉, 트랜잭션 복구의 진행상황을 모니터링할 수 있습니다.
alter session set NLS_DATE_FORMAT=’DD-MON-YYYY HH24:MI:SS’;
SELECT usn, state, undoblockstotal "Total", undoblocksdone "Done", undoblockstotal-undoblocksdone "ToDo", DECODE(cputime,0,'unknown',SYSDATE+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Finish at"
FROM v_$fast_start_transactions;
x$ktuxe뷰를 통해 롤백에 필요한UNDO블록수를 확인할 수 있습니다.
'ktuxesiz' 컬럼이 롤백에 필요한 UNDO블록수를 확인하는 컬럼입니다.
select ktuxeusn, to_char(sysdate,'DD-MON-YYYY HH24:MI:SS') "Time", ktuxesiz, ktuxesta
from x$ktuxe where ktuxecfl = 'DEAD';
출처 : ora9212.wordpress.com/2017/01/21/waiting-for-smon-to-disable-tx-recovery/
'Oracle > 운영' 카테고리의 다른 글
DBA_USERS (0) | 2020.10.29 |
---|---|
RAC DB 운영매뉴얼 (0) | 2020.10.27 |
Supplemental Logging (2) | 2020.10.15 |
UNDO(언두) Segment (0) | 2020.10.14 |
로그 마이너(Log Miner) (0) | 2020.10.12 |
댓글