참고자료

Transaction

  • 1) 해당 트랜잭션에 대해 언두 세그먼트( Undo Segment )를 할당한다. (서버 프로세스가 언두 세그먼트를 획득하는 시점에 적당한 온라인 상태의 언두 세그먼트가 없으면 온라인 상태의 언두가 확보될 때까지 enq: Us - contention )
  • 현재 온라인 상태인 언두 세그먼트 중 하나를 우선적으로 사용한다 ( 랜덤 ) -> 언두 세그먼트 할당
  • 다른 트랜잭션이 사용중이라면 3번까지 재시도한다.
  • 3번까지 재시도 실패시 오프라인 상태의 언두 세그먼트를 온라인화해서 사용한다.
  • 온라인화 실패시 새로운 언두 세그먼트를 생성한다.
  • 언두 세그먼트 생성 실패시 8i에서 사용하던 롤백 세그먼트 알고리즘을 사용한다. ( 다른 트랜잭션에 의해 사용중인 언두 세그먼트 중 가장 사용량이 적은 것을 사용한다. )
  • 2) 언두 세그먼트를 할당받으면, 언두 세그먼트 헤더에 트랜잭션 테이블 슬롯( Transaction Table Slot )을 생성한다.
  • 3) 트랜잭션 테이블을 생성하고 나면 TXID( Transaction ID )를 생성하고, 현재 트랜잭션에 할당한다.
    TXID는 v$TRANSACTION 뷰의 XIDUSN, XIDSLOT, XIDSQN으로 표현하는데, 이값은 트랜잭션에 할당된 언두 영역의 언두 세그먼트 헤더에 존재하는 트랜잭션 테이블의 정확한 위치를 가르킨다.
    트랜잭션은 반드시 언두 영역을 할당받은 다음에 ID를 부여받는 것에 유의하자.
  • 4) 트랜잭션의 대상이 되는 블록들은 버퍼캐시로 적재하고 블록 헤더의 ITL( Interested Transaction List )에 트랜잭션엔트리( Transaction Entry )를 등록한다.
    만일 ITL에 엔트리를 등록할 공간이 없다면, 공간이 확보될 때까지 enq: TX - allocate ITL entry 이벤트를 대기한다.
  • 5) 변경할 블록들의 변경 정보는 PGA에 체인지 벡터라는 이름으로 저장된다.
    보통 하나의 로우가 변경되는 경우 각각 언두 헤더 블록( 체인지 벡터#1 ), 언두 블록( 체인지 벡터#2 ), 데이터 블록( 체인지 벡터#3 )에 해당하는 체인지 벡터들이 생긴다.
    프로세스는 PGA의 체인지 벡터들을 리두 레코드( 또는 리두 엔트리 ) 라는 이름으로 리두 버퍼( Redo Buffer )로 복사한다.
    리두 버퍼에 변경 내용을 복사하는 과정에서 redo copy 래치, redo allocation 래치, redo writing 래치를 획득해야 한다.
    이 과정에서 래치 경합이 발생하면 각각 latch:redo copy, latch: redo allocation, latch: redo writing 이벤트를 대기한다.
  • 6) 이전 이미지( Before Image )에 대한 정보를 언두 블록에 기록하고, 데이터 블록을 변경한다. 변경된 데이터 블록은 더티( Dirty ) 상태가 된다.
    또한 변경된 데이터 블록에 대한 CR 블록이 버퍼 캐시에 생성된다. 만일 변경하고자 하는 로우가 현재 다른 트랜잭션에 의해 변경 중 ( 즉 변경 후 아직 트랜잭션이 종료되지 않은 상태 )이라면
    해당 트랜잭션이 종료되기를 기다려야 하며 enq: TX- row lock contention 이벤트를 대기한다.
  • 7) 커밋이 수행되면, 트랜잭션에 SCN을 할당한다. 커밋 정보는 리두 버퍼에 저장된다.
  • 8) 언두 세그먼트 헤더의 트랜잭션 테이블에 커밋이 이루어졌음을 저장하고, 락을 포함한 모든 리소스에 대한 점유을 해제한다.
  • 9) 리두 버퍼의 내용이 리두 로그 파일에 기록된다. 변경된 블록들은 이후 DBWR 프로세스에 의해 데이터 파일로 기록된다.

블록 클린 아웃

1. Fast Block Cleanout : Fast Commit 방식에 의해 데이터 블록의 내용이 변경되는( Cleanout ) 것을 말함

  • 빠르게 블록을 클린아웃 하는 방식이다.
  • 커밋과 관련된 최소한의 내용만을 변경하게 된다. ( Fast Commit )
  • Fast Block cleanout 방식이 적용된 블록에 대해서는 읽기 작업이나 해당 블록에 DML이 발생하더라도 full cleanout이 발생하지 않는다
  • 해당 블록에 ITL을 재사용하는 시점에 full cleanout이 발생된다.
  • 참고 : 오라클 9i까지는 fast block cleanout 방식이 적용된블록에 DML이 발생할 경우, ITL의 재사용 여부와 상관없이 full cleanout이 발생하였다.

Fast Commit

  • 트랜잭션이 종료되면 언두 헤더 블록내의 state를 변경하고, 관련된 데이터 블록중에 버퍼 캐시에 상주해 있는 블록에 대해서만
    ITL의 Flag필드를 U로 변경하고, Scn/Fsc 필드 중에서 Scn Base# 부분만을 설정한 후에 커밋을 완료하는 방식이다.

테스트 초기화


SQL> DROP TABLE T1 PURGE;
SQL> CREATE TABLE T1( C1 INT, C2 VARCHAR2( 10 ) );
SQL> INSERT INTO T1 SELECT LEVEL, 'AAA' FROM DUAL CONNECT BY LEVEL < 4;
SQL> COMMIT;
SQL> SHOW PARAMETER USER

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
license_max_users                    integer     0
parallel_adaptive_multi_user         boolean     TRUE
user_dump_dest                       string      /usr/local/oracle/admin/luxtv/
                                                 udump
SQL> 


커밋이 완료되었습니다.


Fast Block Cleanout Test



SQL> SELECT ROWID, DBMS_ROWID.ROWID_RELATIVE_FNO( ROWID ) AS RELATIVE_FNO    
  2           , DBMS_ROWID.ROWID_BLOCK_NUMBER( ROWID ) AS BLOCK_NUMBER       
  3           , C1                                                           
  4   FROM T1;                                                               

ROWID              RELATIVE_FNO BLOCK_NUMBER         C1
------------------ ------------ ------------ ----------
AAApU+AAGAAABsnAAA            6         6951          1
AAApU+AAGAAABsnAAB            6         6951          2
AAApU+AAGAAABsnAAC            6         6951          3

SQL> DELETE FROM T1 WHERE C1 = 1;

1 행이 삭제되었습니다.

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6951; --커밋 전 데이터 블록 

시스템이 변경되었습니다.

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM <= 1;

       SID
----------
       314

SQL> SELECT XIDUSN, XIDSLOT, XIDSQN                                 
  2    FROM V$TRANSACTION                                           
  3  WHERE ADDR = (SELECT TADDR FROM V$SESSION WHERE SID = 314 );   

    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
        10         29      52233

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU10$'; --커밋 전 언두 헤더

시스템이 변경되었습니다.


SQL> ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU10$' XID 10 29 52233; --커밋 전 언두 블럭

시스템이 변경되었습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6951; 커밋 후 데이터 블록 

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU10$'; --커밋 후 언두 헤더

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU10$' XID 10 29 52233; --커밋 후 언두 블럭

시스템이 변경되었습니다.

--소문자는 다른 세션 2
SQL> select count(*) from t1;

  COUNT(*)
----------
         2

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6951; -- 다른 세션에서 READ 후 데이터 블록 

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU10$'; -- 다른 세션에서 READ 후 언두 헤더

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU10$' XID 10 29 52233; -- 다른 세션에서 READ 후 언두 블럭

시스템이 변경되었습니다.


SQL> DELETE FROM T1 WHERE C1 = 2;

1 행이 삭제되었습니다.

SQL> SELECT XIDUSN, XIDSLOT, XIDSQN                                
  2    FROM V$TRANSACTION                                          
  3  WHERE ADDR = (SELECT TADDR FROM V$SESSION WHERE SID = 314 );  

    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         3         20      50124

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6951; -- DML 후 데이터 블록 

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU3$'; -- DML 후 언두 헤더

SQL> ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU3$' XID 3 20 50124;  -- DML 후 언두 블럭



Fast Block Cleanout - 1단계 : 커밋 전 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951
buffer tsn: 7 rdba: 0x01801b27 (6/6951)
scn: 0x0003.7d3a87ee seq: 0x03 flg: 0x02 tail: 0x87ee0603
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b27
Object id on Block? Y
seg/obj: 0x2953e csc: 0x03.7d3a8800 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b21 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.020.0000d758 0x00800476.5916.21 C--- 0 scn 0x0003.7d3a87ee
0x02 0x000a.01d.0000cc09 0x00800382.509f.21


1 fsc 0x0008.00000000 <--

data_block_dump,data header at 0x1ae69a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x1ae69a64
bdba: 0x01801b27
76543210
flag=




ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7a
avsp=0x1f62
tosp=0x1f6c
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f7a
0x14:pri[1] offs=0x1f84
0x16:pri[2] offs=0x1f8e
block_row_dump:
tab 0, row 0, @0x1f7a <--
tl: 2 fb: --HDFL-- lb: 0x2 <--
tab 0, row 1, @0x1f84
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 03
col 1: 3 41 41 41
tab 0, row 2, @0x1f8e
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 04
col 1: 3 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951

{CODE}

Database Block address( DBA ) : 4byte

  • 상대 파일 번호 : DBA의 상위 10bits
  • 블록 번호 : DBA의 하위 22bits
    {CODE:SQL}

SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (TO_NUMBER('00800382','XXXXXXXXX') ) FROM DUAL --상대 파일 번호

SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (TO_NUMBER('00800382','XXXXXXXXX') ) FROM DUAL --블록 번호

{CODE}

Xid 분석 ( 0x000a.01d.0000cc09 ) : 언두 바인딩 후 할당 받음

  • USN( 0x000a ) : 10번 언두( _SYSSMU8$ )에 롤백을 위한 정보을 저장 있으며 ( SELECT TO_NUMBER('000a','XXXXXXXXX') FROM DUA )
  • SLOLT( 01d ) : 10번 언두 헤더 블록내에 있는 29번째( 01d ) 트랜잭션 슬롯에 트랜잭션과 관련된 정보를 저장하고 있으며 ( SELECT TO_NUMBER('01d','XXXXXXXXX') FROM DUAL )
  • WRAP( 0000cc09 ) : 해당 트랜잭션 슬롯은 6312번 ( 0000d758 ) 재사용되었다는 것을 알수있다. 재사용시 1씩 증가 ( LECT TO_NUMBER('0000cc09','XXXXXXXXX') FROM DUAL )

Uba 분석 ( 0x00800382.509f.21 ) : 트랜잭션에 의해 처음으로 사용된 언두 블록의 주소를 나타냄

  • UDBA : 언두블록의 DBA( Database block address( 상대번호 : 2, 블록번호 : 898 ) )를 나타내며
  • SEQ : 시퀀스 번호
  • SLOT : 언두블록 내의 레코드 번호
  • ex : 해당 트랜잭션에 대한 롤백 정보를 저장하기 위해 2개의 언두 블록이 사용되었고, 각 언두 블록의 주소를 사용 순서대로 나타냈을 때
    0x00800382, 0x00800383라고 가정했을 때, 이럴 때 UDBA : 0x00800382

Flag 분석 (
) : 트랜잭션이 완료되지 않았으므로, Flag에는 아무런 정보도 가지고 있지 않다.

Lck 분석 ( 1 ) : 트랜잭션과 관련된 레코드의 수이다. 1개의 로우 레벨 락을 설정한 상태이다.

Scn/Fsc 분석( fsc 0x0008.00000000 ) : 현재 트랜잭션이 진행중이므로 Scn이 할당되지 않았으므로, 8kytes( 0x0008 )의 Free 공간이 발생

  • Scn : System change Number을 나타내며, Fsc는 Free Space Credit를 나타낸다.
  • Fsc : 해당 트랜잭션으로 인해, 테이터 블록 내에 발생되는 프리 공간을 의미한다.

Fast Block Cleanout - 1단계 : 커밋 전 언두 헤드 덤프

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU10$ (10)
********************************************************************************

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x1c 9 0x00 0xcc04 0x0000 0x0003.7d3a818b 0x00800380 0x0000.000.00000000 0x00000001 0x00000000 1331776328
0x1d 10 0x80 0xcc09 0x0002 0x0003.7d3a87ee 0x00800382 0x0000.000.00000000 0x00000001 0x00000000 0
0x1e 9 0x00 0xcc05 0x0028 0x0003.7d3a7f76 0x0080037f 0x0000.000.00000000 0x00000001 0x00000000 1331775331
...

      • 2012-03-15 11:28:30.284

{CODE}

index( 0x1d ) 및 state( 10 ) 분석

  • TRN TBL( Transaction Table ) : 트랜잭션 슬롯 정보
  • index ( 0x1d ) : 슬롯 번호( Xid( 0x000a.01d.0000cc09 ) : 두번재 필드 정보와 동일 )
  • state : 트랜잭션의 상태를 나타냄 ( 10 : Active 트랜잭션, 9 : 트랜잭션 종료 )

wrap# 분석( 0xcc09 ) : 트랜잭션이 재사용 될때 마다 증가 ( Xid( 0x000a.01d.0000cc09 ) : 세 번재 필드 정보와 동일 )

dba 분석( 0x00800382 ) : 해당 되는 트랜잭션의 이전 이미지를 저장한 언두 블록의 주소를 나타낸다.

  • 데이터 블록의 ITL에서 관리하는 Uba( 0x00800382.509f.21 )의 첫번째 필드 값과 동일한 값을 나타내므로,
    해당 트랜잭션을 위해서 한 개의 언두 블록이 사용되었다는것을 알 수 있다.

scn 분석

  • 아직 트랜잭션이 종료 전이라 이전 scn을 가지고 있는 상태 ( 준비 Insert 3개 )

Fast Block Cleanout - 1단계 : 커밋 전 언두 블럭 덤프

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU10$ (10)
xid: 0x000a.01d.0000cc09
Low Blk : (0, 0)
High Blk : (2, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2

********************************************************************************
UNDO BLK: Extent: 2 Block: 121 dba (file#, block#): 2,0x00000382 <--
xid: 0x000a.01d.0000cc09 seq: 0x509f cnt: 0x21 irb: 0x21 icl: 0x0 flg: 0x0000 <--

*








-

  • Rec #0x21 slt: 0x1d objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007) <--
  • Layer: 11 (Row) opc: 1 rci 0x00 <--
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000000 <--
    *






    -
    {CODE}

xid 분석 ( 0x000a.01d.0000cc09 ) : ITL Xid( 데이터 블록 ) 및 트랜잭션 슬롯( 언두헤더 )와 동일( 3개의 블록 클래스간의 연결고리( Xid ) )

cnt( 0x21 ) : 해당 언두 블록에서 언두 레코드의 개수 ( 현재 33개( 0x21 )의 언두 레코드를 저장하고 있다 ( SELECT TO_NUMBER('21','XXXXXXXXX') FROM DUAL --33 ) )

irb 분석( 0x21 ) : 해당 언두 블록에서 마지막으로 저장된 언두 레코드 번호( 재 33번째 ( 0x21 )의 언두 레코드가 마지막으로 저장하고 있다 ( SELECT TO_NUMBER('21','XXXXXXXXX') FROM DUAL --33 ) )

objd 분석( 169278 ) : 언두 레코드와 관련된 오브젝트 번호를 나타낸다. DBA_OBJECTS.OBJECT_ID에 나나내는 값과 동일함.

rci( 0x00 ) 분석 : 이전 언두 레코드 번호를 나타낸다. ( 0x00 : 1개의 언두 레코드 )

  • Rollback을 수행하기 위해서는 마지막 언두 레코드부터 시작해서 최초의 언두 레코드까지 적용해야만 하므로,
    항상 현재 언두 레코드는 이전 언두 레코드 번호를 가진다.

rdba( 0x00000000 ) 분석

  • 만일 rci 0x00 값을 가지는 언두 레코드의 rdba 값이 설정이 되어 있다면( ex: 0x00000001 ), 해당 트랜잭션은 2개 이상의 언두 블럭을 사용한 것이며,
    rdba 값이 0x00000000 인 경우에는 해당 트랜잭션이 1개의 언두 블록을 사용한 것이다.
  • 현재 1개의 언두 블록내의 1개의 언두 레코드를 가지고 있다고 볼 수있다.
  • ex : 해당 트랜잭션에 대한 언두 정보를 저장하기 위해 2개의 언두 블록이 사용되었고, 각 언두 블록의
    각 언두 블록의 주소를 사용 순서대로 나타냈을 때, 0x00000382, 0x00000383이라고 가정하면, 0x00000383 언두 블록에서
    rci 0x00 값을 가지는 언두 레코드의 rdba=0x00000382
rdba ( 0x00000001 ) 이라면 이렇게 되지 않을까?( 시간관계상 테스트는 못해봤음 ㅡㅡ^ )
{CODE:SQL}
********************************************************************************
Undo Segment: _SYSSMU10$ (10)
xid: 0x000a.01d.0000cc09
Low Blk : (0, 0)
High Blk : (2, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2

********************************************************************************
UNDO BLK: Extent: 2 Block: 121 dba (file#, block#): 2,0x00000382 <--
xid: 0x000a.01d.0000cc09 seq: 0x509f cnt: 0x21 irb: 0x21 icl: 0x0 flg: 0x0000

*








-

  • Rec #0x21 slt: 0x1d objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007)
  • Layer: 11 (Row) opc: 1 rci 0x00 <--
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000000 <--
    *






    -

********************************************************************************
UNDO BLK: Extent: 2 Block: 121 dba (file#, block#): 2,0x00000383 <--
xid: 0x000a.01d.0000cc09 seq: 0x509f cnt: 0x21 irb: 0x21 icl: 0x0 flg: 0x0000

*








-

  • Rec #0x21 slt: 0x1d objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007)
  • Layer: 11 (Row) opc: 1 rci 0x00 <--
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000382 <--
    *






    -
    {CODE}

Fast Block Cleanout - 2단계 : 커밋 후 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951
buffer tsn: 7 rdba: 0x01801b27 (6/6951)
scn: 0x0003.7d3a8b1f seq: 0x01 flg: 0x02 tail: 0x8b1f0601 <--
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b27
Object id on Block? Y
seg/obj: 0x2953e csc: 0x03.7d3a8800 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b21 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.020.0000d758 0x00800476.5916.21 C--- 0 scn 0x0003.7d3a87ee – 7d3a87ee == 2100987886
0x02 0x000a.01d.0000cc09 0x00800382.509f.21 --U- 1 fsc 0x0008.7d3a8b1f – 7d3a8b1f == 7d3a8b1f

data_block_dump,data header at 0x1ae69a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x1ae69a64
bdba: 0x01801b27
76543210
flag=




ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7a
avsp=0x1f62
tosp=0x1f6c
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f7a
0x14:pri[1] offs=0x1f84
0x16:pri[2] offs=0x1f8e
block_row_dump:
tab 0, row 0, @0x1f7a
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x1f84
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 03
col 1: 3 41 41 41
tab 0, row 2, @0x1f8e
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 04
col 1: 3 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951

{CODE}

Scn 분석 ( 0x0003.7d3a8b1f ) : 트랜잭션이 완료되어 Scn이 할당되었고, 해당 Scn이 데이터 블록내에 저장됨

  • Scn Wrap ( 0x0003 ) : Scn Base에 해당되는 4bytes를 다 사용하면, 1 증가 한다.
  • Scn Base ( 7d3a8b1f ) : 트랜잭션이 완료하여 Scn을 할당 받을 때 마다 증가함
    {CODE:SQL}

SELECT TO_NUMBER('7d3a87ee','XXXXXXXXX') FROM DUAL --2100987886

SELECT TO_NUMBER('7d3a8b1f','XXXXXXXXX') FROM DUAL --2100988703

{CODE}

Xid 분석 ( 0x000a.01d.0000cc09 ) : 커밋전( 0x000a.01d.0000cc09 ) 과 동일

Uba 분석 ( 0x00800382.509f.21 ) : 커밋전 동일

Flag 분석 ( --U- )

  • U Flag( Upper bound Commit ) : Upper bound Commit이라는 의미이다. Fast Commit의 일부분임

Fast Block Cleanout - 2단계 : 커밋 후 언두 헤드 덤프

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU10$ (10)
********************************************************************************

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x1c 9 0x00 0xcc04 0x0000 0x0003.7d3a818b 0x00800380 0x0000.000.00000000 0x00000001 0x00000000 1331776328
0x1d 9 0x00 0xcc09 0xffff 0x0003.7d3a8b1f 0x00800382 0x0000.000.00000000 0x00000001 0x00000000 1331779629 <--
0x1e 9 0x00 0xcc05 0x0028 0x0003.7d3a7f76 0x0080037f 0x0000.000.00000000 0x00000001 0x00000000 1331775331
...

      • 2012-03-15 11:47:29.977

{CODE}

state 분석 ( 9 )

  • 커밋이 완료 되었으므로 트랜잭션 슬롯의 state 값이 10에서 9로 변견됨

scn 분석( 0x0003.7d3a8b1f )

  • 커밋이 완료 되었으므로 scn이 할당되고 그 값이 해당 트랜잭션 슬롯의 scn 칼럼에서 관리된다.
  • 커밋 시점의 데이타 블록 scn( 0x0003.7d3a8b1f )과 트랜잭션 슬롯의 scn은 동일한 값을 가진다.

Fast Block Cleanout - 2단계 : 커밋 후 언두 블럭 덤프 ( 커밋 수행 후에 언두 블록에 대한 변경사항은 없다. )

{CODE:SQL}

*******************************************************************************
Undo Segment: _SYSSMU10$ (10)
xid: 0x000a.01d.0000cc09
Low Blk : (0, 0)
High Blk : (2, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2

+++++++++++ XID mismatch. Some records may not belong to specified transaction.
+ WARNING + Block xid: 0x000a.01b.0000cc05 dba (file#, block#): 2,0x00000382
+++++++++++ Input xid: 0x000a.01d.0000cc09

********************************************************************************
UNDO BLK: Extent: 2 Block: 121 dba (file#, block#): 2,0x00000382
xid: 0x000a.01b.0000cc05 seq: 0x509f cnt: 0x24 irb: 0x24 icl: 0x0 flg: 0x0000

*








-

  • Rec #0x21 slt: 0x1d objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007)
  • Layer: 11 (Row) opc: 1 rci 0x00
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000000
    *






    -

{CODE}

Fast Block Cleanout - 3단계 : READ 후 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951
buffer tsn: 7 rdba: 0x01801b27 (6/6951)
scn: 0x0003.7d3a8b1f seq: 0x01 flg: 0x02 tail: 0x8b1f0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b27
Object id on Block? Y
seg/obj: 0x2953e csc: 0x03.7d3a8800 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b21 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0007.020.0000d758 0x00800476.5916.21 C--- 0 scn 0x0003.7d3a87ee
0x02 0x000a.01d.0000cc09 0x00800382.509f.21 --U- 1 fsc 0x0008.7d3a8b1f

data_block_dump,data header at 0x1ae69a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x1ae69a64
bdba: 0x01801b27
76543210
flag=




ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7a
avsp=0x1f62
tosp=0x1f6c
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f7a
0x14:pri[1] offs=0x1f84
0x16:pri[2] offs=0x1f8e
block_row_dump:
tab 0, row 0, @0x1f7a
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x1f84
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 03
col 1: 3 41 41 41
tab 0, row 2, @0x1f8e
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 04
col 1: 3 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951

{CODE}

Fast Block Cleanout - 3단계 : READ 후 언두 헤더

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU10$ (10)
********************************************************************************

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x1c 9 0x00 0xcc04 0x0000 0x0003.7d3a818b 0x00800380 0x0000.000.00000000 0x00000001 0x00000000 1331776328
0x1d 9 0x00 0xcc09 0x0024 0x0003.7d3a8b1f 0x00800382 0x0000.000.00000000 0x00000001 0x00000000 1331779629 --
0x1e 9 0x00 0xcc06 0x0028 0x0003.7d3a8c88 0x00800388 0x0000.000.00000000 0x00000001 0x00000000 1331780315
...

      • 2012-03-15 12:03:57.204

{CODE}

Fast Block Cleanout - 3단계 : READ 후 언두 블록

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU10$ (10)
xid: 0x000a.01d.0000cc09
Low Blk : (0, 0)
High Blk : (2, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2

+++++++++++ XID mismatch. Some records may not belong to specified transaction.
+ WARNING + Block xid: 0x000a.00a.0000cc02 dba (file#, block#): 2,0x00000382
+++++++++++ Input xid: 0x000a.01d.0000cc09

********************************************************************************
UNDO BLK: Extent: 2 Block: 121 dba (file#, block#): 2,0x00000382
xid: 0x000a.00a.0000cc02 seq: 0x509f cnt: 0x3d irb: 0x3d icl: 0x0 flg: 0x0000

*








-

  • Rec #0x21 slt: 0x1d objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007)
  • Layer: 11 (Row) opc: 1 rci 0x00
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000000
    *






    -

{CODE}

Fast Block Cleanout - 4단계 : DML 후 데이터 블록 ( 커밋 전 )

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951
buffer tsn: 7 rdba: 0x01801b27 (6/6951)
scn: 0x0003.7d3a946b seq: 0x01 flg: 0x04 tail: 0x946b0601
frmt: 0x02 chkval: 0x8f4a type: 0x06=trans data
Block header dump: 0x01801b27
Object id on Block? Y
seg/obj: 0x2953e csc: 0x03.7d3a8800 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b21 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.014.0000c3cc 0x008005e0.5007.15


1 fsc 0x0008.00000000 <-- Full Cleanout : Fsc 비움 , Xid 변경됨 : 0x0007.020.0000d758( 이전 )
0x02 0x000a.01d.0000cc09 0x00800382.509f.21 --U- 1 fsc 0x0008.7d3a8b1f

data_block_dump,data header at 0x1ae69a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x1ae69a64
bdba: 0x01801b27
76543210
flag=




ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f70
avsp=0x1f62
tosp=0x1f76
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f7a
0x14:pri[1] offs=0x1f70
0x16:pri[2] offs=0x1f8e
block_row_dump:
tab 0, row 0, @0x1f7a
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x1f70 <-- Full Cleanout
tl: 2 fb: --HDFL-- lb: 0x1 <-- Full Cleanout
tab 0, row 2, @0x1f8e
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: 2 c1 04
col 1: 3 41 41 41
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6951 maxblk 6951

{CODE}

Fast Block Cleanout - 4단계 : DML 후 언두 헤더

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU3$ (3)
********************************************************************************

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x13 9 0x00 0xc3cf 0x0027 0x0003.7d3a8f49 0x008005d6 0x0000.000.00000000 0x00000001 0x00000000 1331781029
0x14 10 0x80 0xc3cc 0x0002 0x0003.7d3a8b1f 0x008005e0 0x0000.000.00000000 0x00000001 0x00000000 0
0x15 9 0x00 0xc3d2 0x0011 0x0003.7d3a8e91 0x008005de 0x0000.000.00000000 0x00000001 0x00000000 1331780847
...

      • 2012-03-15 14:22:20.337

{CODE}

Fast Block Cleanout - 4단계 : DML 후 언두 블럭

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU3$ (3)
xid: 0x0003.014.0000c3cc
Low Blk : (0, 0)
High Blk : (2, 127)
Object Id : ALL
Layer : ALL
Opcode : ALL
Level : 2

********************************************************************************
UNDO BLK: Extent: 2 Block: 87 dba (file#, block#): 2,0x000005e0
xid: 0x0003.014.0000c3cc seq: 0x5007 cnt: 0x15 irb: 0x15 icl: 0x0 flg: 0x0000

*








-

  • Rec #0x15 slt: 0x14 objn: 169278(0x0002953e) objd: 169278 tblspc: 7(0x00000007)
  • Layer: 11 (Row) opc: 1 rci 0x00
    Undo type: Regular undo Begin trans Last buffer split: No
    Temp Object: No
    Tablespace Undo: No
    rdba: 0x00000000
    *






    -

{CODE}

Fast Block Cleanout 결과 분석

  • 1. 커밋 시에 fast block cleanout 방식이 적용되는 블록은 커밋과 관련된 최소한의 내용만을 변경하게 된다.
  • 2. fast block cleanout 방식이 적용딘 블록에 대해서는 읽기 작업이나 해당 블록에 DML이 발생하더라도 full cleanout이 발생하지 않는다.
  • 3. ITL을 재사용 하는 시점에 full cleanout이 발생된다.
  • 4. 참고로 오라클 9i까지는 fast block cleanout 방식이 적용된 블록에 DML이 발생할 경우,
    ITL의 재사용 여부와 상관없이 full cleanout이 발생하였다.
    결국, full block cleanout 시점을 최대한 뒤로 미루도록 코드가 변경된 것이다.

2. Delayed Block Cleanout

  • 트랜잭션이 갱신한 블록 개수가 총 버퍼 캐시 블록 개수의 1/10을 초과 할때 사용하는 방식이다.
  • 블록을 읽는 과정에서 Active 상태의 블록, 즉 다른 트랜잭션이 발생시킨 변경사항에 대한 커밋 정보가 아직 ITL에 기록되지 않았다면 일기 전에 먼저 블록 클린아웃을 시도한다.
    ITL 슬롯에 기록된 트랜잭션 ID를 이용해 ㅕㅜ애 세그먼트 헤더에 있는 트랜잭션 테이블 슬롯을 찾아가 트랜잭션의 현재 상태를 확인하고 커밋된 트랜잭션이라면
    이를 ITL 슬롯에 반영하고 로우 LOCK 정보를 해제해 블록을 클린아웃 시킨다. ( 이건 태스트 불가능할듯 ... )
    블록 클린 아웃을 위한 갱신내용도 Redo에 로깅하며, 블론 SCN도 변경한다.

Delayed Block Cleanout 순서

  • 1) ITL 슬롯에 커밋 정보 저장
  • 2) 레코드에 기록된 Lock Byte 해제
  • 3) Online Redo에 Logging

Block Cleanout과 Undo

  • 오라클은 클린아웃 시에 필요한 정보( Scn Base#, Wrap# )를 획득하기 위해서 ITL의 XID를 이용하여 언두 헤더의 트랜잭션 슬롯 정보를 참조해야 한다. ( Fast or Delayed )
  • 클린아웃을 하려는 시점에 해당 언두가 존재하지 않거나( 언두 테이블스페이스 변경 또는 언두 세그먼트 offline/drop 등 )
  • 언두 헤더의 트랜잭션 슬롯이 재사용되어 기존 정보가 사라졌다면 어덯게 될까?

언두 세그먼트가 존재하지 않는 경우의 cleanout 방식 ( Delayed Block Cleanout 만 )

  • 오라클에서는 현재 valid한 언두뿐 아니라 invalid 한 언두까지 sys.UNDO$에 내용을 보관하고 있다.
  • sys.UNDO$의 STATUS$ 칼럼은 언두의 상태를 나타낸다. 1이면 Invalid, 3이면 Valid
  • XID 의 USN#=2이라면, 현재 2번 언두는 Invalid 상태이므로 Scn Base#= 1785762266, Scn Wrap#=3을 이용하여 블록클린아웃을 수행한다.
    {CODE:SQL}
    SQL> SELECT US#, NAME, SCNBAS, SCNWRP, STATUS$ FROM SYS.UNDO$;

US# NAME SCNBAS SCNWRP STATUS$



--






--

--

--

--
0 SYSTEM 0 0 3
1 _SYSSMU1$ 1785762276 3 3
2 _SYSSMU2$ 1785762266 3 1
3 _SYSSMU3$ 1785762273 3 3
4 _SYSSMU4$ 1785762054 3 3
5 _SYSSMU5$ 1785762055 3 3
6 _SYSSMU6$ 1785762272 3 3
7 _SYSSMU7$ 1785762274 3 3
8 _SYSSMU8$ 1785762275 3 3
9 _SYSSMU9$ 1785762270 3 3
10 _SYSSMU10$ 1785762271 3 3
{CODE}

언두 헤더의 트랜잭션 슬롯이 재사용된 경우의 Cleanout 방식 ( Delayed Block Cleanout 만 )

  • 언두 헤더의 트랜잭션 테이블에는 일정한 개수의 트랜잭션 슬롯을 관리하므로, 해당 언두를 사용하는 트랜잭션의 수가 트랜잭션 슬롯의 수를 넘어서게 되면,
    당연히 트랜잭션 슬롯들을 재사용되며, wrap#가 1증가하게끔 되어있다.
  • 트랜재션이 재사용 되는 시점에 해당 트랜잭션 슬롯에 관리되던 scn 정보를 언두 헤더의 트랜잭션 컨트롤( TRN CTL ) 부분에 저장하게 된다.
  • 기존의 슬롯정보를 참조하려던 세션이 슬롯이 재사용되어 ( wrap#가 일치하지 않아서 ) 기존 scn정보를 획드하지 못할 경우에는 TRN CTL에서 scn정보를 이용하여 클린아수을 수행한다.

테스트 초기화

{CODE:SQL}
SQL> DROP TABLE T2 PURGE;
SQL> CREATE TABLE T2( C1 NUMBER, C2 VARCHAR2( 10 ) );
SQL> INSERT INTO T2 SELECT LEVEL, 'C2' FROM DUAL CONNECT BY LEVEL <= 1000;
SQL> SELECT RELATIVE_FNO, BLOCK_NUMBER, COUNT(*) CNT
2 FROM (
3 SELECT ROWID, DBMS_ROWID.ROWID_RELATIVE_FNO( ROWID ) AS RELATIVE_FNO
4 , DBMS_ROWID.ROWID_BLOCK_NUMBER( ROWID ) AS BLOCK_NUMBER
5 , C1
6 FROM T2
7 )
8 GROUP BY RELATIVE_FNO, BLOCK_NUMBER;

RELATIVE_FNO BLOCK_NUMBER CNT









--
6 6959 614
6 6960 386

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM <= 1;

SID



--
314

SQL> SELECT XIDUSN, XIDSLOT, XIDSQN
2 FROM V$TRANSACTION
3 WHERE ADDR = (SELECT TADDR FROM V$SESSION WHERE SID = 314 );

XIDUSN XIDSLOT XIDSQN



--

--

--
2 30 52837 <-- 같은 언두를 사용해야하는데 음...

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6960;

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU2$';

시스템이 변경되었습니다.

{CODE}

Delayed Block Cleanout Test

{CODE:SQL}

SQL> SELECT RELATIVE_FNO, BLOCK_NUMBER, COUNT(*) CNT
2 FROM (
3 SELECT ROWID, DBMS_ROWID.ROWID_RELATIVE_FNO( ROWID ) AS RELATIVE_FNO
4 , DBMS_ROWID.ROWID_BLOCK_NUMBER( ROWID ) AS BLOCK_NUMBER
5 , C1
6 FROM T2
7 )
8 GROUP BY RELATIVE_FNO, BLOCK_NUMBER;

RELATIVE_FNO BLOCK_NUMBER CNT









--
6 6959 614
6 6960 386

SQL> DELETE FROM T2;

1000 행이 삭제되었습니다.

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM <= 1;

SID



--
297

SQL> SELECT XIDUSN, XIDSLOT, XIDSQN
2 FROM V$TRANSACTION
3 WHERE ADDR = (SELECT TADDR FROM V$SESSION WHERE SID = 297 );

XIDUSN XIDSLOT XIDSQN



--

--

--
4 13 59703

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6960; --커밋 전 데이터 블록 덤프

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU4$'; --커밋 전 언두 헤더

시스템이 변경되었습니다.

SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;

시스템이 변경되었습니다.

SQL> COMMIT;

커밋이 완료되었습니다.

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6960; -- Buffer Flush, COMMIT 후 데이터 블록 덤프

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU4$'; -- Buffer Flush, COMMIT 후 언두 헤더

시스템이 변경되었습니다.

SQL> select count(*) from t2; --다른 세션에서 실행

COUNT(*)



--
0

SQL> ALTER SYSTEM DUMP DATAFILE 6 BLOCK 6960; -- READ 후 데이터 블록 덤프

시스템이 변경되었습니다.

SQL> ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU4$'; -- READ 후 언두 헤더

시스템이 변경되었습니다.

{CODE}

Delayed Block Cleanout - 0단계 : 슬롯 재사용 데이타 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960
buffer tsn: 7 rdba: 0x01801b30 (6/6960)
scn: 0x0003.7d3b7844 seq: 0x01 flg: 0x02 tail: 0x78440601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b30
Object id on Block? Y
seg/obj: 0x29591 csc: 0x03.7d3b782b itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b29 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.01e.0000ce65 0x0080020f.50e4.1d --U- 386 fsc 0x0000.7d3b7844
0x02 0x0000.000.00000000 0x00000000.0000.00


0 fsc 0x0000.00000000

data_block_dump,data header at 0x175faa64
===============
tsiz: 0x1f98
hsiz: 0x316
pbl: 0x175faa64
bdba: 0x01801b30
76543210
flag=




ntab=1
nrow=386
frre=-1
fsbo=0x316
fseo=0x1088
avsp=0xd72
tosp=0xd72
0xe:pti[0] nrow=386 offs=0
0x12:pri[0] offs=0x19b3
0x14:pri[1] offs=0x19bd
0x16:pri[2] offs=0x19c7
...
block_row_dump:
tab 0, row 0, @0x19b3
tl: 10 fb: --H-FL-- lb: 0x1 cc: 2
col 0: 3 c2 07 10
col 1: 2 43 32
tab 0, row 1, @0x19bd
tl: 10 fb: --H-FL-- lb: 0x1 cc: 2
col 0: 3 c2 07 11
col 1: 2 43 32
tab 0, row 2, @0x19c7
tl: 10 fb: --H-FL-- lb: 0x1 cc: 2
col 0: 3 c2 07 12
col 1: 2 43 32
tab 0, row 3, @0x19d1
...
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960

{CODE}

Delayed Block Cleanout - 0단계 : 슬롯 재사용 언두 헤더

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU2$ (2)
********************************************************************************
TRN CTL:: seq: 0x50e4 chd: 0x0005 ctl: 0x001e inc: 0x00000000 nfb: 0x0002
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x0080020f.50e4.19 scn: 0x0003.7d3b71e5

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x0c 9 0x00 0xce5c 0x0013 0x0003.7d3b7717 0x0080020f 0x0000.000.00000000 0x00000001 0x00000000 1331870401
0x0d 9 0x00 0xce42 0x000c 0x0003.7d3b7713 0x0080020f 0x0000.000.00000000 0x00000001 0x00000000 1331870401
0x0e 9 0x00 0xce5e 0x0002 0x0003.7d3b73b4 0x0080020c 0x0000.000.00000000 0x00000001 0x00000000 1331869097
...

{CODE}

Delayed Block Cleanout - 1단계 : 커밋 전 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960
buffer tsn: 7 rdba: 0x01801b30 (6/6960)
scn: 0x0003.7d3b787e seq: 0x20 flg: 0x00 tail: 0x787e0620
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b30
Object id on Block? Y
seg/obj: 0x29591 csc: 0x03.7d3b7879 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b29 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.01e.0000ce65 0x0080020f.50e4.1d C--- 0 scn 0x0003.7d3b7844
0x02 0x0004.00d.0000e937 0x008006bc.555d.20


386 fsc 0x0c0c.00000000

data_block_dump,data header at 0x6e76a64
===============
tsiz: 0x1f98
hsiz: 0x316
pbl: 0x06e76a64
bdba: 0x01801b30
76543210
flag=




ntab=1
nrow=386
frre=-1
fsbo=0x316
fseo=0x1088
avsp=0xd72
tosp=0x1c82
0xe:pti[0] nrow=386 offs=0
0x12:pri[0] offs=0x19b3
0x14:pri[1] offs=0x19bd
0x16:pri[2] offs=0x19c7
...
block_row_dump:
tab 0, row 0, @0x19b3
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x19bd
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 2, @0x19c7
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 3, @0x19d1
...
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960

{CODE}

Delayed Block Cleanout - 1단계 : 커밋 전 언두 헤드 덤프

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU4$ (4) -- 만약 언두 헤더가 2이라면
********************************************************************************

TRN CTL:: seq: 0x555d chd: 0x0000 ctl: 0x0028 inc: 0x00000000 nfb: 0x0002
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x008006ac.555d.16 scn: 0x0003.7d3b741d <-- 트랜잭션 슬롯 재사용으로 클린아웃을 위해 왼쪽 scn이 0x0003.7d3b7713 게 변경된다구 함

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x0c 9 0x00 0xe939 0x0012 0x0003.7d3b7728 0x008006a9 0x0000.000.00000000 0x00000001 0x00000000 1331870402
0x0d 10 0x80 0xe937 0x0002 0x0003.7d3b77ee 0x008006bc 0x0000.000.00000000 0x0000000f 0x00000000 0
0x0e 9 0x00 0xe947 0x0004 0x0003.7d3b77d9 0x008006ac 0x0000.000.00000000 0x00000001 0x00000000 1331870531

{CODE}

Delayed Block Cleanout - 2단계 : Buffer Flush, COMMIT 후 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960
buffer tsn: 7 rdba: 0x01801b30 (6/6960)
scn: 0x0003.7d3b787e seq: 0x20 flg: 0x04 tail: 0x787e0620
frmt: 0x02 chkval: 0xd8d5 type: 0x06=trans data
Block header dump: 0x01801b30
Object id on Block? Y
seg/obj: 0x29591 csc: 0x03.7d3b7879 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b29 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.01e.0000ce65 0x0080020f.50e4.1d C--- 0 scn 0x0003.7d3b7844
0x02 0x0004.00d.0000e937 0x008006bc.555d.20


386 fsc 0x0c0c.00000000

data_block_dump,data header at 0x6e76a64
===============
tsiz: 0x1f98
hsiz: 0x316
pbl: 0x06e76a64
bdba: 0x01801b30
76543210
flag=




ntab=1
nrow=386
frre=-1
fsbo=0x316
fseo=0x1088
avsp=0xd72
tosp=0x1c82
0xe:pti[0] nrow=386 offs=0
0x12:pri[0] offs=0x19b3
0x14:pri[1] offs=0x19bd
0x16:pri[2] offs=0x19c7
...
block_row_dump:
tab 0, row 0, @0x19b3
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 1, @0x19bd
tl: 2 fb: --HDFL-- lb: 0x2
tab 0, row 2, @0x19c7
tl: 2 fb: --HDFL-- lb: 0x2
...
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960

{CODE}

Delayed Block Cleanout - 2단계 : Buffer Flush, COMMIT 후 언두 헤더

{CODE:SQL}

********************************************************************************
Undo Segment: _SYSSMU4$ (4)
********************************************************************************

TRN CTL:: seq: 0x555d chd: 0x0000 ctl: 0x000d inc: 0x00000000 nfb: 0x0003
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x008006ac.555d.16 scn: 0x0003.7d3b741d

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x0c 9 0x00 0xe939 0x0012 0x0003.7d3b7728 0x008006a9 0x0000.000.00000000 0x00000001 0x00000000 1331870402
0x0d 9 0x00 0xe937 0xffff 0x0003.7d3b78ac 0x008006bc 0x0000.000.00000000 0x0000000f 0x00000000 1331870824
0x0e 9 0x00 0xe947 0x0004 0x0003.7d3b77d9 0x008006ac 0x0000.000.00000000 0x00000001 0x00000000 1331870531

{CODE}

Delayed Block Cleanout - 3단계 : READ 후 데이터 블록 덤프

{CODE:SQL}

Start dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960
buffer tsn: 7 rdba: 0x01801b30 (6/6960)
scn: 0x0003.7d3b78c1 seq: 0x01 flg: 0x00 tail: 0x78c10601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x01801b30
Object id on Block? Y
seg/obj: 0x29591 csc: 0x03.7d3b78c1 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1801b29 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.01e.0000ce65 0x0080020f.50e4.1d C--- 0 scn 0x0003.7d3b7844
0x02 0x0004.00d.0000e937 0x008006bc.555d.20 C--- 0 scn 0x0003.7d3b78ac

data_block_dump,data header at 0x6e76a64
===============
tsiz: 0x1f98
hsiz: 0x316
pbl: 0x06e76a64
bdba: 0x01801b30
76543210
flag=




ntab=1
nrow=386
frre=0
fsbo=0x316
fseo=0x1088
avsp=0x1c82
tosp=0x1c82
0xe:pti[0] nrow=386 offs=0
0x12:pri[0] sfll=1
0x14:pri[1] sfll=2
0x16:pri[2] sfll=3
...
block_row_dump:
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 6960 maxblk 6960

{CODE}

Delayed Block Cleanout - 3단계 : READ 후 언두 헤더

{CODE:SQL}``

********************************************************************************
Undo Segment: _SYSSMU4$ (4)
********************************************************************************

TRN CTL:: seq: 0x555d chd: 0x0000 ctl: 0x000d inc: 0x00000000 nfb: 0x0003
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x008006ac.555d.16 scn: 0x0003.7d3b741d

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt


























...
0x0c 9 0x00 0xe939 0x0012 0x0003.7d3b7728 0x008006a9 0x0000.000.00000000 0x00000001 0x00000000 1331870402
0x0d 9 0x00 0xe937 0xffff 0x0003.7d3b78ac 0x008006bc 0x0000.000.00000000 0x0000000f 0x00000000 1331870824
0x0e 9 0x00 0xe947 0x0004 0x0003.7d3b77d9 0x008006ac 0x0000.000.00000000 0x00000001 0x00000000 1331870531
...

{CODE}

Delayed Block Cleanout 결과 분석

  • 커밋 시에 delayed block cleanout 방식이 적용되는 블록은 아무런 변경사항이 발생하지 않는다.
  • 해당 블록은 버퍼 캐시로 적재되는 시점에 full cleanout이 발생하게 된다.