'UNDO 목적'
Transcation Rollback
Transaction Recovrey
Read Consistency
일반 테이블 세그먼트와 동일한 구조로 가진다. (extent 단위 확장, 버퍼캐시 사용)
각 트랜잭션 별로 Undo 세그먼트를 할당하고 그 트렌잭션이 발생시킨*
테이블과 인덱스의 변경사항들을 Undo 레코드 단위로 Undo 세그먼트 블록에 기록*
9i 이상 Automatic Undo Management (AUM) 사용으로
1개 UNDO Segment : 1개 트랜잭션 할당을 목표로 자동 관리
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
트랜잭션 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 슬롯 번호 (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 을 할당해 해당 로우를 갱신중인 ITL 슬롯번호 기록함 (Row-level Lock)
레코드 갱신
LockByte 활성화(turn on) -> ITL slot -> transcation Solt -> acitve 대기
Committed 레코드 갱신