How Much Longer?: Rollback Monitoring

Tags:

Oracle Database 10g: The Top 20 Features for DBA의 내용입니다.
Week 2에 해당하고 http://www.oracle.com/technology/pub/articles/10gdba/week2_10gdba.html 에 본문이 있습니다.

주요 내용은 롤백할 때 시간이 오래걸린다면, 그 남은 시간을 어떻게 예측하는가 하는 것입니다.

Oracle 9i

SELECT USED_UREC
FROM V$TRANSACTION;

위와 같이 하면, 롤백되야 되는 레코드의 수가 나온다는 것이죠. 시간이 갈 수록 당연히 줄어들테고..

Oracle 10g

select time_remaining
from v$session_longops
where sid = ;

오라클 10g에서는 위와같이 할 수 있다네요. 그런데 원래 안되던건가요? ;; 저 v$session_longops 뷰는 굉장히 눈에 익은데..

더 편리하게 보려면 다음과 같이 합니다.

print_table의 사용

SQL> set serveroutput on size 999999
SQL> exec print_table(‘select * from v$session_longops where sid = 9’)
SID : 9
SERIAL# : 68
OPNAME : Transaction Rollback
TARGET :
TARGET_DESC : xid:0x000e.01c.00000067
SOFAR : 10234
TOTALWORK : 20554
UNITS : Blocks
START_TIME : 07-dec-2003 21:20:07
LAST_UPDATE_TIME : 07-dec-2003 21:21:24
TIME_REMAINING : 77
ELAPSED_SECONDS : 77
CONTEXT : 0
MESSAGE : Transaction Rollback: xid:0x000e.01c.00000067 :
10234 out of 20554 Blocks done
USERNAME : SYS
SQL_ADDRESS : 00000003B719ED08
SQL_HASH_VALUE : 1430203031
SQL_ID : 306w9c5amyanr
QCSID : 0

남은 시간 계산하는건, 지금까지 소요 시간이 77초이니까 77 * ( 10234 / (20554-10234) ) ≈ 77 seconds 하면 됩니다.

그외에도 디비가 돌다가 죽으면 최종적으로 실행중이던 트랜잭션은 다음 인스턴스 재시작시 자동으로 롤백이되죠. 그 때 오라클에서는 parallel 로 죽어버렸던 애들을 병렬적으로 복구할 수 있는데요..

이 때 관련되는 뷰가 V$FAST_START_TRANSACTIONS (복구 트랜잭션들), V$FAST_START_SERVERS (병렬 서버) 이렇게 2개가 있습니다.

복구에 참여하는 서버의 숫자 보기

select rcvservers from v$fast_start_transactions;

위와 같은 질의도 그래서 가능하고.. 만약 결과가 1이면 serially 복구 중이란 말입니다. 그러한 경우에는 RECOVERY_PARALLELISM (복구시 사용되는 서버 프로세스의 수) 를 0이나 1을 제외한 값으로 설정하고, ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH 를 하면 CPU개수의 4배로 병렬 서버를 만들어 줍니다. (아마 통상 2배로 해서 병렬 작업을 돌리죠. 즉, CPU 1개당 병렬 프로세스 2개씩 하는게 일반적이고, 여기서는 무작정 빨리 복구하겠다는거니까 4배가 되죠.)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *