05 UNDO

'UNDO 목적'

Transcation Rollback
Transaction Recovrey
Read Consistency



  일반 테이블 세그먼트와 동일한 구조로 가진다. (extent 단위 확장, 버퍼캐시 사용)
  각 트랜잭션 별로 Undo 세그먼트를 할당하고 그 트렌잭션이 발생시킨*
  테이블과 인덱스의 변경사항들을 Undo 레코드 단위로 Undo 세그먼트 블록에 기록*
 
  9i 이상 Automatic Undo Management (AUM) 사용으로
  1개 UNDO Segment : 1개 트랜잭션 할당을 목표로 자동 관리


UNDO 관련 Parameter

 Parameter 
   UNDO_MANAGEMENT (defualt AUTO) auto | default 
   UNDO_RETENTION (default 900)
  
 Automatic Undo Retention Tuning (tuned_undo_retention)
    10gR1 - undo_retention 을 0 으로 설정
    10gR2 - Undo 테이블스페이스의 retention 속성을 noguarantee 로 설정

  DBA_TABLESPACES.RETENTION (default : NOGUARANTEE )


If UNDO_MANAGEMENT=AUTO (no matter the setting for UNDO_RETENTION) automatic undo tuning will be used.
MMON will calculate the MAXQUERYLEN every 30 sec interval.  Based upon the MAXQUERYLEN, MMON decides the 
TUNED_UNDORETENTION. That means the new UNDO RETENTION will be set to TUNED_UNDORETENTION. 


Undo Segment Transaction Table Slot

Undo Segment Transaction Table Slot

트랜잭션 ID : USN#(Undo Segment Number) + Slot# + Wrap#
트랜잭션 상태정보 : committed, Active
커밋 SCN : 트랜잭션이 commit 된 경우
LAST UBA (Undo Block Address)
기타

할당 대기 : undo segment tx slot



Insert : 추가된 레코드의 rowid
update : 변경되는 컬럼에 대한 before image
delete : 지워지는 로우의 모든 커럼에 대한 before image




SQL> 

  1  select xidusn, xidslot, xidsqn
  2   from v$transaction
  3*  where addr=(select taddr from v$session where sid = 191)

SQL> /

    XIDUSN    XIDSLOT	  XIDSQN
---------- ---------- ----------
	 8	    5	  135143

Elapsed: 00:00:00.00

SQL> alter system dump undo header '_SYSSMU8_3131027383$';

System altered.

SQL> alter system dump undo block '_SYSSMU8_3131027383$' xid 8 5 135143;

System altered.

Elapsed: 00:00:00.72

********************************************************************************
Undo Segment:  _SYSSMU8_3131027383$ (8)
********************************************************************************
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 47     #blocks: 14207
                  last map  0x00000000  #maps: 0      offset: 4080
      Highwater::  0x00c1833f  ext#: 7      blk#: 319    ext size: 1024
  #blocks in seg. hdr's freelists: 0
  #blocks below: 0     
  mapblk  0x00000000  offset: 7
                   Unlocked
     Map Header:: next  0x00000000  #extents: 47   obj#: 0      flag: 0x40000000


  TRN CTL:: seq: 0x05e1 chd: 0x0015 ctl: 0x0000 inc: 0x00000000 nfb: 0x0001
            mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
            uba: 0x00c18326.05e1.25 scn: 0x0281.d17c806a
Version: 0x01
  FREE BLOCK POOL::
    uba: 0x00c18326.05e1.2a ext: 0x7  spc: 0x13ea
    uba: 0x00000000.05e1.02 ext: 0x7  spc: 0x1f06
    uba: 0x00000000.05e1.03 ext: 0x7  spc: 0x18a0
    uba: 0x00000000.052c.01 ext: 0x1c spc: 0x1f7c
    uba: 0x00000000.0419.01 ext: 0x29 spc: 0x1ed0
  TRN TBL::
 
  index  state cflags  wrap#    uel         scn            dba            parent-xid    nub     stmt_num    cmt
  ------------------------------------------------------------------------------------------------
   0x00    9    0x00  0x20ff2  0xffff  0x0281.d17c8718  0x00c18326  0x0000.000.00000000  0x00000001   0x00000000  1330944981
   0x01    9    0x00  0x20fd4  0x001b  0x0281.d17c8530  0x00c18321  0x0000.000.00000000  0x00000001   0x00000000  1330944603
   0x02    9    0x00  0x20fd7  0x000e  0x0281.d17c837c  0x00c18320  0x0000.000.00000000  0x00000001   0x00000000  1330943868
   0x03    9    0x00  0x20fe3  0x0010  0x0281.d17c8220  0x00c1831f  0x0000.000.00000000  0x00000001   0x00000000  1330943387



블록 헤더 ITL 슬롯

ITL 슬롯 번호 (Interested Transaction List)
트랜잭션 ID
UBA (Undo Block Address)
커밋 Flag
Locking 정보
커밋 SCN (- 트랜잭션이 커밋된 경우)


 레코드를 갱신하기 위해서는 해당 블록에 ITL 슬롯을 확보해야 한다.
 - 부족할 경우 :  enq: TX - allocate ITL entry 
 - initrans(default 2), maxtrans(max 255), pctfree 
 - UPDATE 으로 인한 PCTFREE 여유 공간이 없는 경우 추가 슬롯 생성이 불가능.

Lock Byte

 레코드가 저장되는 로우마다 그 헤더에 Lock Byte 을 할당해 해당 로우를 갱신중인 ITL 슬롯번호 기록함 (Row-level Lock)

 레코드 갱신 
 LockByte 활성화(turn on) -> ITL slot -> transcation Solt -> acitve    대기
                                                             Committed 레코드 갱신