본문 바로가기
Oracle/운영

Waiting for smon to disable tx recovery.(10.2.0.3 Shutdown 시 Alert log)

by 취미툰 2020. 10. 19.
반응형

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

댓글