오라클 성능 고도화 원리와 해법 I (2012년)
Undo 0 0 99,999+

by 구루비스터디 Undo [2018.03.20]


  1. 05 UNDO
    1. UNDO 목적
    2. UNDO 관련 Parameter
    3. Undo Segment Transaction Table Slot
    4. 블록 헤더 ITL 슬롯
    5. Lock Byte


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 레코드 갱신
코어 오라클 데이터베이스 스터디 모임 에서 2012년에 오라클 성능 고도화 원리와 해법 I 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3069

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입