index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x0700 0x0001 0x0000.00261e9a 0x00c00556 0x0000.000.00000000 0x00000001 0x00000000 1445942394
0x01 9 0x00 0x0701 0x000d 0x0000.00261e9e 0x00c00556 0x0000.000.00000000 0x00000001 0x00000000 1445942397
0x02 9 0x00 0x0701 0x000a 0x0000.00261958 0x00c0054d 0x0000.000.00000000 0x00000002 0x00000000 1445942348
...
0x0f 9 0x00 0x06ff 0x0016 0x0000.00261f38 0x00c00557 0x0000.000.00000000 0x00000001 0x00000000 1445942516
0x10 10 0x80 0x0700 0x0002 0x0000.00261fd2 0x00c0055c 0x0000.000.00000000 0x00000006 0x00000000 0 <<<<< 현재 active된 세션
...
0x21 9 0x00 0x06fe 0x0019 0x0000.00261b31 0x00c00553 0x0000.000.00000000 0x00000003 0x00000000 1445942352
SELECT XIDUSN, XIDSLOT, XIDSQN FROM V$TRANSACTION;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
7 27 1697
1 row selected.
SELECT TRUNC(ID1 / 65536) USN, MOD(ID1, 65536) SLOT, ID2 WRAP, LMODE FROM V$LOCK WHERE TYPE = 'TX';
USN SLOT WRAP LMODE
---------- ---------- ---------- ----------
7 27 1697 6
1 row selected.
컬럼명 | 설명 |
---|---|
index | 트랜잭션 테이블 내의 로우의 순번(transaction table slot 번호) |
state | 엔트리의 상태 inactive=9 active=10 |
cflags | 트랜잭션의 상태 flag, 0x0 : no transaction, 0x10 : dead transaction, 0x80 : active transaction |
wrap# | 슬롯이 재사용된 횟수 |
uel | 이 슬롯이 active상태로 변경된 후에, 다음 번으로 사용될 트랜잭션 테이블 슬롯에 대한 포인터 |
scn | 커밋 된 트랜잭션에 대한 commit SCN(트랜잭션이 active일 때는 start SCN으로도 사용) |
dba | 트랜잭션이 마지막으로 사용한 언두 블록의 주소(Data Block Address), 롤백 작업의 시작 위치를 알 수 있음 |
nub | 해당 트랜잭션에 의해 지금까지 사용된 언두 블록의 수(롤백을 수행하면 감소됨 |
cmt | Commit 시점과 가장 가까운 초. 1970년 1월 1일 0시(UTC)부터의 시간을 초로 환산 |
SELECT INDX
, KTUXESTA
, KTUXECFL
, KTUXESQN WRAP#
, KTUXESCNW SCNW
, KTUXESCNB SCNB
, KTUXERDBF DBA_FILE
, KTUXERDBB DBA_BLOCK
, KTUXESIZ NUB
FROM X$KTUXE
WHERE KTUXEUSN = 7 AND KTUXESLT <= 28;
INDX KTUXESTA KTUXECFL WRAP# SCNW SCNB DBA_FILE DBA_BLOCK NUB
0 INACTIVE NONE 1700 0 2606387 3 32900 1
1 INACTIVE NONE 1699 0 2606480 3 32901 1
2 INACTIVE NONE 1697 0 2606448 3 32901 1
3 INACTIVE NONE 1698 0 2605864 3 32898 1
4 INACTIVE NONE 1700 0 2606585 3 32901 1
5 INACTIVE NONE 1693 0 2606406 3 32901 1
6 INACTIVE NONE 1698 0 2606456 3 32901 1
7 INACTIVE NONE 1698 0 2606430 3 32901 1
8 INACTIVE NONE 1698 0 2606031 3 32898 1
9 INACTIVE NONE 1697 0 2605995 3 32898 1
10 INACTIVE NONE 1699 0 2606244 3 32898 1
11 INACTIVE NONE 1699 0 2606458 3 32901 1
12 INACTIVE NONE 1697 0 2606595 3 32901 1
13 INACTIVE NONE 1698 0 2607103 3 32902 1
14 INACTIVE NONE 1697 0 2605899 3 32898 1
15 INACTIVE NONE 1696 0 2606341 3 32900 1
16 INACTIVE NONE 1697 0 2606716 3 32901 1
17 INACTIVE NONE 1698 0 2606485 3 32901 1
18 INACTIVE NONE 1699 0 2606898 3 32902 1
19 INACTIVE NONE 1696 0 2606097 3 32898 1
20 INACTIVE NONE 1698 0 2606743 3 32901 1
21 INACTIVE NONE 1699 0 2606272 3 32900 1
22 INACTIVE NONE 1696 0 2606190 3 32898 1
23 INACTIVE NONE 1698 0 2606422 3 32901 1
24 INACTIVE NONE 1697 0 2606269 3 32900 2
25 INACTIVE NONE 1699 0 2606665 3 32901 1
26 INACTIVE NONE 1699 0 2606857 3 32902 1
27 ACTIVE NONE 1697 0 2607103 3 32902 1
28 INACTIVE NONE 1698 0 2605924 3 32898 1
********************************************************************************
UNDO BLK: Extent: 65 Block: 30 dba (file#, block#): 3,0x0000119e
xid: 0x0003.01a.0000072f seq: 0x1bb cnt: 0x32 irb: 0x32 icl: 0x0 flg: 0x0000 <<<<<< xid: 0x0003.01a.0000072f : 언두세그먼트 + 슬롯번호 + wrap#(재사용횟수)
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1f3c 0x02 0x1e90 0x03 0x1e18 0x04 0x1db0 0x05 0x1d48
0x06 0x1c9c 0x07 0x1c24 0x08 0x1bbc 0x09 0x1b54 0x0a 0x1aa8
0x0b 0x19fc 0x0c 0x1994 0x0d 0x18e8 0x0e 0x1880 0x0f 0x1830
0x10 0x17d0 0x11 0x1728 0x12 0x167c 0x13 0x1614 0x14 0x159c
0x15 0x1534 0x16 0x1488 0x17 0x1410 0x18 0x1364 0x19 0x12fc
0x1a 0x1294 0x1b 0x122c 0x1c 0x1180 0x1d 0x1118 0x1e 0x10a0
0x1f 0x1038 0x20 0x0fd0 0x21 0x0f68 0x22 0x0ebc 0x23 0x0e54
0x24 0x0dec 0x25 0x0d74 0x26 0x0cc8 0x27 0x0c1c 0x28 0x0b90
0x29 0x0b40 0x2a 0x0a94 0x2b 0x09bc 0x2c 0x096c 0x2d 0x08e8
0x2e 0x0890 0x2f 0x07f0 0x30 0x0758 0x31 0x06ec 0x32 0x0680
*-----------------------------
* Rec #0x32 slt: 0x1a objn: 76065(0x00012921) objd: 76065 tblspc: 4(0x00000004) <<<<<< slt: 0x1a
* Layer: 11 (Row) opc: 1 rci 0x31
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat bit: 4 (post-11) padding: 0
op: C uba: 0x00c0119e.01bb.31
KDO Op code: IRP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0100028c hdba: 0x0100028a
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 2(0x2) size/delt: 9
fb: --H-FL-- lb: 0x0 cc: 2
null: --
col 0: [ 2] c1 04
col 1: [ 2] c1 04
*-----------------------------
* Rec #0x31 slt: 0x1b objn: 76065(0x00012921) objd: 76065 tblspc: 4(0x00000004) <<<<<< slt: 0x1b
* Layer: 11 (Row) opc: 1 rci 0x30
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
* Rec #0x30 slt: 0x1a objn: 76065(0x00012921) objd: 76065 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000Ext idx: 0
flg2: 0
create table t1(id number, n1 number);
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);
commit;
Block header dump: 0x0040fad2
Object id on Block? Y
seg/obj: 0x4aa15 csc: 0x76c.7f167cb3 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
---------------------------------------------------------------------------------------
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.001.00001de4 0x01802ec8.0543.05 --U- 3 fsc 0x0000.01731c46 <<<<< 트랜잭션 0x000d.002.000306a3 (14번째 세그먼트, 2번째 슬롯, 시퀀스번호 000306a3 )가 최근 블록을 변경했다는 사실 확인, SCN 01731c46 시점에 커밋, 해당 블록은 클린아웃 되지 않음(Flag = U), Lock 카운트는 3개(Lck), 이 트랜잭션의 롤백 레코드는 0x01802ec8.0543.05 에 저장되어 있음
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 <<<<< 2번째 인덱스의 커럼값이 모두 0으로 이번에 처음 사용되는 블록임을 알 수 있음
data_block_dump,data header at 0x1881085c
===============
tsiz: 0x1fa0
hsiz: 0x18
pbl: 0x1881085c
bdba: 0x0040fad2
76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f85
avsp=0x1f6d
tosp=0x1f6d
0xe:pti[0] nrow=3 offs=0
0x12:pri[0] offs=0x1f97
0x14:pri[1] offs=0x1f8e
0x16:pri[2] offs=0x1f85
block_row_dump:
tab 0, row 0, @0x1f97
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2 <<< lb:0x1 : Lock이 설정됨
col 0: [ 2] c1 02
col 1: [ 2] c1 02
tab 0, row 1, @0x1f8e
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2 <<< lb:0x1 : Lock이 설정됨
col 0: [ 2] c1 03
col 1: [ 2] c1 03
tab 0, row 2, @0x1f85
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2 <<< lb:0x1 : Lock이 설정됨
col 0: [ 2] c1 04
col 1: [ 2] c1 04
end_of_block_dump
언두헤더 덤프하는 법
SELECT UBAFIL, UBABLK, UBAREC FROM V$TRANSACTION;
UBAFIL UBABLK UBAREC
SELECT SEGMENT_NAME FROM DBA_EXTENTS WHERE FILE_ID = 3 AND 32902 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
SEGMENT_NAME
ALTER SYSTEM DUMP undo block '_SYSSMU7_137577888$' xid 7 27 1697;
컬럼명 | 설명 |
---|---|
Itl | 리스트에 대한 인덱스 |
Xid | 이 블록을 변경한 최근 트랜잭션ID. "언두세그먼트"."언두슬롯"."언두시퀀스번호" |
Uba | 이 블록의 트랜잭션에 의해 생성된 가장 최근 언두 레코드의 주소. "절대블록주소"."블록시퀀스번호"."블록 내의 레코드 번호" |
Flag | 트랜잭션의 상태 bit 플래그 : active --U -: Upper bound commit C---: Commited 및 cleaned out(관련된 모든 lock type들은 0으로 초기화) |
Lck | 해당 트랜잭션에 의해 이 블록 내에 락이 설정된 로우의 수 |
Scn/Fsc | Commit SCN 또는 사용 가능한 free영역의 크기 |
Session 1: update t1 set n1 = 101 where id = 1;
Session 2: update t1 set n1 = 102 where id = 2;
commit;
My session: set transaction read only; -- isolation level을 read only로 설정
-- 다른 사용자의 uncommit 된 데이터 및 이후 시점에 commit 된 변경사항을 볼 수 없다고 함
Session 3: update t1 set n1 = 99 where id = 3;
commit;
My session: select id, n1 from t1; -- 교재에서는 (1,1), (2,102), (3,3) 출력된다고 함
>> 실제 출력데이터는
ID N1
---------- ----------
1 1
2 102
3 99
3 rows selected.
Block header dump: 0x0040fad2
Object id on Block? Y
seg/obj: 0x4aa15 csc: 0x76c.7f167cd7 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
---------------------------------------------------------------------------------------
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.00e.00001b93 0x01800518.04f5.34 -U-- 1 fsc 0x0000.01731c83 <<<< 3개의 세션에서 작업이 실행됐지만 엔트리는 총 2개 존재(ITL은 제한된 자원이므로), Lock count는 1
0x02 0x0004.00c.00001964 0x018036ad.05ff.3a ---- 1 fsc 0x0000.00000000 <<<< uncommit된 트랜잭션, Lock count는 1
0x12:pri[0] offs=0x1f7b
0x14:pri[1] offs=0x1f71
0x16:pri[2] offs=0x1f85
block_row_dump:
tab 0, row 0, @0x1f7b
tl: 10 fb: --H-FL-- lb: 0x2 cc: 2 <<<<< ITL 2번 트랜잭션에 의해 lock 설정됨
col 0: [ 2] c1 02
col 1: [ 3] c2 02 02
tab 0, row 1, @0x1f71
tl: 10 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [ 3] c2 02 03
tab 0, row 2, @0x1f85
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2 <<<<< ITL 1번 트랙잰션에 의해 lock 설정됨
col 0: [ 2] c1 04
col 1: [ 2] c1 64
end_of_block_dump
1. 버퍼 내에 블록을 복사한 후, 다음 4단계를 수행
2. 필요한 경우, commit된 트랜잭션에 대한 클린아웃 수행
3. Uncommit된 트랜잭션으로부터 변경된 내용을 원복
4. 만일 target SCN(트랜잭션 또는 쿼리시작시점의 SCN)보다 큰 commit SCN을 가진 트랜잭션의 변경사항이 존재한다면, 가장 큰 commit SCN을 가진 트랜잭션의 변경사항부터 원복
5. 필요한 경우, 4번 단계를 반복.
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.00e.00001b93 0x01800518.04f5.34 -U-- 1 fsc 0x0000.01731c83
0x02 0x0004.00c.00001964 0x018036ad.05ff.3a ---- 1 fsc 0x0000.00000000
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.00e.00001b93 0x01800518.04f5.34 -U-- 1 fsc 0x0000.01731c83
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.00d.00002100 0x018030ca.074c.11 C--- 0 scn 0x0000.01731c7a
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
TRN CTL: : seq: OxO85f chd: Ox0000 ctl: Ox0017 inc : Oxoooooooo nfb: Ox0001
mgc: OxOb02 xts: Ox0069 flg: Ox0001 opt : 2147483646 (0x7ffffffe)
uba: 0x0190120f.08f5.21 scn: 0x018bc704