by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

2.4 Redo Log의 구성 및 Redo 스트럭처




1. 리두 로그 구성

1) 리두 로그 : 헤더 + 리두 레코드
2) 리두 레코드

  • 리두 레코드 헤더 + 하나 이상의 체인지 벡터
  • atomic한 변경에 대한 언두와 리두를 저장한다.

2. 리두 스트럭처


SQL >create table t1 ( c1 number, c2 varchar2(10), c3 char(20));

Table created.

SQL >create index t1_idx01 on t1(c1);

Index created.

SQL >alter system switch logfile;

System altered.

SQL >col first_change# format 999999999999999
SQL >col member format a60
SQL >set linesize 140  
SQL >select a.first_change#, a.status, b.member
  2  from   v$log a, v$logfile b
  3  where  a.group#=b.group#
  4  /

   FIRST_CHANGE# STATUS           MEMBER
---------------- ---------------- ------------------------------------------------------------
  11183973161928 INACTIVE         /data01/oradata/ENTER/redo01.log
  11183973161997 ACTIVE           /data02/oradata/ENTER/redo02.log
  11183973162166 CURRENT          /data03/oradata/ENTER/redo03.log

SQL >insert into t1 values ( 1, 'ABC', 100 );

1 row created.

SQL >commit;

Commit complete.

SQL >alter system dump logfile '/data03/oradata/ENTER/redo03.log' scn min 11183973162166;

System altered.

오퍼레이션 리두 레코드# 체인지 벡터# OP CODE 설명
  REDO RECODE #1 CHANGE #1 13.5 (데이터 블록)  
segment management REDO RECODE #2 CHANGE #1 13.6 (데이터 블록)  
  REDO RECODE #3 CHANGE #1 13.6 (데이터 블록)  
    CHANGE #2 13.7 (세그먼트 헤더 블록)  
    CHANGE #1 5.2 (언두 헤더) 초기 트랜잭션을 위해 언두를 할당받는 과정에서 발생하는 언두 헤더 블록 변경
테이블 입력 REDO RECODE #1 CHANGE #2 5.1 (언두 블록) 데이터 블록의 이전 이미지를 저장하는 언두 블록의 변경
    CHANGE #3 11.2 (데이터 블록 입력) 데이터 블록 변경
?   CHANGE #4 5.20  
인덱스 입력 REDO RECODE #2 CHANGE #1 5.2 (언두 블록) 인덱스 블록의 이전 이미지를 저장하는 언두 블록의 변경
    CHANGE #2 10.2 (인덱스 블록 입력) 인덱스 블록 변경
커밋 REDO RECODE #3 CHANGE #1 5.4 (트랜잭션 완료) 커밋에 대한 리두 레코드가 생성

2-1. 리두 레코드

2-1-1. 리두 레코드 헤더

필드명 설명
Thread (1) Log Thread 번호를 의미한다.
V$LOG.THREAD# 와 동일한 값을 가진다.
따라서 RAC 구성이 아닌 경우에는 항상 1이다.
RBA (Redo Byte Address)
(0x0002b4.00000005.0140)
모든 리두 레코드는 10Bytes 길이의 RBA를 가진다.
시작 주소를 의미하며, 3개의 필드로 구성되어 있다.
① 리두로그시퀀스 번호 - V$LOG.SEQUENCD#와 동일
② 리두로그 안에서의 블록 번호(e.g 00000005)를 의미
③ 블록내의 오프셋(e.g 0140)을 의미한다.
3개 필드의 값으로 복구 시에 적용할 리두 레코드의 위치는 알아낸다.
LEN (0x0224) 리두 레코드의 길이를 의미한다.
SCN (0x0a2b.f8bf5ea1) System Change Number를 의미한다.
SCN은 읽기 일관성과 복구를 위해 사용된다.
SCN은 2개의 필드로 구성되어 있다.
① SCN Wrap(2byte, e.g 0x0a2b) 은 SCN Base에 해당되는 숫자가 4byte이 범위를 넘어설 때 증가한다.
② SCN Base(4byte, e.g f8bf5ea1)는 새로운 SCN이 할당될 때 마다 증가한다.
SCN은 커밋 시마다 순차적으로 증가하게 되며, 6byte가 사용된다.
SUBSCN
(4 05/20/2011 18:35:05)
1개의 SCN은 복수개의 SUBSCN을 포함한다.
SUBSCN에는 SCN에 속한 SUBSCN의 순번, 변경된 날짜와 시각을 의미한다.

2-1-2. 체인지 벡터

1) 체인지 벡터는 싱글 데이터 블록에 대한 변경사항을 기록하며, 언두 헤더 블록, 언두 블록, 세그먼트 헤더 블록,데이터 블록에 적용된다.
2) 체인지 벡터는 데이터 블록 버퍼가 변경되기 전에 PGA 내부에 생성되며 3가지로 구성되어 있다.

2-1-2-1. 체인지 벡터 헤더

필드명 설명
CHANGE 하나의 리두 레코드에 속한 체인지 벡터의 번호를 표시한다.
다음 3개에 대한 체인치 벡터 헤더를 표현한다.
① 언두 블록 헤더 (CLS 19 : block class 15+2r 공식에 의해 DBA_ROLLBACK_SEGS.SEGMENT_ID=2인 _SYSMU5$ 언두세그먼트 헤더 블록을 의미한다.)
② 언두 블록 (CLS 20 : block class 16+2r 공식에 의해 DBA_ROLLBACK_SEGS.SEGMENT_ID=2인 _SYSMU5$ 언두세그먼트 블록을 의미한다.)
③ 데이터 블록 (CLS 1)
CLS 블록 클래스(Block Classes) 를 의미하며 X$BH.CLASS와 동일하다.
10gR2기준의 블록 클래스 번호의 의미
AFN Absolute File Number (절대 파일 번호)를 의미하며, V$DATAFILE.FILE#의 값과 동일하다.
DBA 모든 데이터베이스 블록은 상대 파일 번호와 블록 번호로 구성된 4bytes의 Database Block Address 를 가진다.
DBA의 상위 10bits는 상대 파일 번호를 의미하며, 하위 22bits는 블록 번호를 의미한다.
오라클에서 제공하는 DBMS_UTILITY 패키지를 이용하여 16진수로 표시되는 DBA를 손쉽게 상대 파일 번호와 블록 번호로 변환이 가능하다.
set serveroutput on
DECLARE
    l_dba       NUMBER := TO_NUMBER ('8388633','XXXXXXXX');
    l_file      NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);
    l_block     NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
        BEGIN
           DBMS_OUTPUT.PUT_LINE ('File  : '||l_file);
           DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
       END;
    /
File  : 32
Block : 3704371

PL/SQL procedure successfully completed.
OBJ 오브젝트 번호를 의미한다. 테이블 및 인덱스 블록인 경우는 DBA_OBJECTS.OBJECT_ID와 동일하다.
SQL >select owner, object_name from  dba_objects where object_id = 101803;

OWNER                          OBJECT_NAME
------------------------------ ------------------------------
LKWTEST                        T1
SCN System Change Number를 의미한다.
커밋시에 SCN을 할당받으므로 현재 SCN은 트랜잭션과 관련된 블록들이 가지고 있는 이전 SCN값이다.
리두 레코드 헤더의 SCN은 CHANGE# 가장 큰 Change Vector의 SCN과 동일하다. ( 데이터블록의 Change Vector의 경우만?? )
SEQ SCN에 대한 Sequence Number를 의미한다.
OP 블록에 대해 수행된 오퍼레이션을 의미한다.
각각의 오퍼레이션은 레이어 코드와 서브 코드로 구성된다.

2-1-2-2. Transaction Identifier (XID)

① XID는 트랜잭션에 부여되는 아이디라고 볼 수 있다. 각각의 트랜잭션은 모두 고유한 XID를 할당받게 된다.
② XID는 트랜잭션과 관련된 언두 헤더 블록, 언두 블록 및 데이터 블록에 대한 연결 고리로써도 사용되며 usn.slot.wrap 필드로 구성된다.
☞ usn : 언두 세그먼트 번호, slot : 트랜잭션 슬롯 번호, wrap : 시퀀스
③ 언두 헤더 블록 내의 트랜잭션 슬롯을 할당 받아야만 트랜잭션 수행이 가능한 것이다.

2-1-2-3. Undo Block Address (UBA)

① UBA는 언두 블록 내의 변경된 주소를 나타내며 7bytes의 길이를 갖는다.
② UBA는 udba.seq.slot 필드로 구성된다.
☞ udba : 언두 블록의 DBA, seq : 시퀀스번호, slot : 블록 내의 레코드 번호

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.