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;
execute dump_table_block('t1');
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 0x000d.002.000306a3 0x008015b2.74bd.1f --U- 3 fsc 0x0000.7f167cb4
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
-------------> 책과 다름 --------------------------------------------------------------
-- 책 내용 복사
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.001.00001de4 0x01802ec8.0543.05 --U- 3 fsc 0x0000.01731c46
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
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
col 0: [ 2] c1 02
col 1: [ 2] c1 02
tab 0, row 1, @0x1f8e
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 03
col 1: [ 2] c1 03
tab 0, row 2, @0x1f85
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 04
col 1: [ 2] c1 04
end_of_block_dump
SQL> select to_number('01802ec8', 'xxxxxxxx') from dual;
TO_NUMBER('01802EC8','XXXXXXXX')
--------------------------------
25177800
SQL>
select dbms_utility.data_block_address_file(25177800) file#,
dbms_utility.data_block_address_block(25177800) block#
from dual;
SQL> 2 3
FILE# BLOCK#
---------- ----------
6 11976
컬럼명 | 설명 |
---|---|
Itl | 리스트에 대한 인덱스. 이 숫자는 블록 내에 물리적으로 저장되지 않는다. 이 것은 덤프를 수행할 때 (프로그램)코드에 의해 생성되며, 로우에 락을 설정한 트랜잭션을 식별하기 위해 로우의 lock byte(lb:)값으로 사용된다. |
Xid | 이 블록을 변경한 최근 트랜잭션의 transaction id. "언두세그먼트"."언두슬롯"."언두시퀀스번호" |
Uba | 이 블록에 대한 트랜잭션에 의해 생성된 가장 최근 언두 레코드의 주소. "절대블록주소"."블록시퀀스번호"."블록 내의 레코드 번호" |
Flag | 이 트랜잭션의 명확한 상태를 식별할 수 있는 bit 플래그. : active(Xid 내의 모든 필드가 0인 경우에는 "never existed") --U-: Upper bound commit("fast commit"수행 중에도 설절) C---: Commited 및 cleaned out(관련된 모든 lock type들은 0으로 초기화됨) 이전 내용을 보유한 레코드를 가리킨다는 설명을 본 적이 있다. 하지만 이것을 확인하기 위한 작업은 수행하지 않을 것이다. ---T: 필자는 이것이 블록 클린아웃 수행 중이라는 설명을 본 적이 있다. 하지만 이것을 확인하기 위한 작업은 수행하지 않을 것이다. |
Lck | 해당 트랜잭션에 의해 이 블록 내에 락이 설정된 로우의 수 |
Scn/Fsc | Flag에 따라, commit SCN을 의미하거나, 이 트랜잭션이 커밋 되었을 때 가용한 free영역의 크기를 의미(Fsc:Free Space Credit) |
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) 출력
--> 실제 (oracle 10g 10.2.0.4) 테스트 불가
ID N1
---------- ----------
1 1
2 102
3 99
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 0x0003.01c.000382c9 0x008021bf.8695.0b C--- 0 scn 0x076c.7f167cd0
0x02 0x000c.023.0003434b 0x00802a6b.7b56.04 ---- 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
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=0x1f71
avsp=0x1f6b
tosp=0x1f6b
0xe:pti[0] nrow=3 offs=0
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
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
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
-- 5단계 이후 복사본의 ITL
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
6. 이 시점에, uncommit 된 트랜잭션은 더 이상 존재하지 않는다.
오라클은 target SCN과 ITL내의 모든 SCN을 비교한 후, 0x01731c83이 너무 크다고 판단한다.
7. 언두 레코드 0x01800518.04f5.34 를 읽음으로써 트랜잭션 0x000a.00e.00001b93에 의해 변경된 내용을 원복하는 작업을 시작.
8. 이 언두 레코드는 "테이블 0의 로우 2의 컬럼 1은 c1 04(십진수 3)로 변경되어야 한다"는 것을 알려준다.
이것은 로우의 크기에 영향을 미치지 않으므로 동일한 위치에 변경을 적용한다.
9. 해당 언두 레코드는 해당 트랜잭션에 의해 이 블록에 적용된 첫 번째 변경이므로, ITL 0x01 엔트리의 이전 버전을 보유하고 있다.
10. 오라클은 target SCN 보타 큰 SCN이 ITL내에 존재하지 않는다는 것을 확인.
11. 이것이 해당 세션에서 필요로 하는 정확한 읽기 일관성 버전이다.
이시점의 블록 덤프내용은 책 p61 참고