關於block的ITL和dump的擴充套件

dotaddjj發表於2012-04-27

關於blockITLdump的擴充套件

關於blockITL,資料塊在建立時預設會在每個block中分配兩個ITL,也就是initrans,會有list,最大允許有255 Interested Transaction List,也就是block上的maxtrans。而initrans2是初始分配給block的,雖然經過dbms_metadata.get_dll檢視初始分配了initrans 1,其實大家可以在建立後dump塊看看,初始分配了兩個,而即使手動定義的maxtrans 210g下已經失去了意義,oracle一樣會初始分配2ITL,最大允許255ITL

注:oracle 9i推出了自動段空間管理,使block中的fctused引數失效,因為不再用freelists管理段內的空間,避免了segment頭的單個freelist競爭,而改為點陣圖管理extentfree use資訊。不過關於ITL的分配個人經過測試無論在手動還是自動段空間管理下,oracle初始都會分配兩個initrans,最大到255maxtrans,這在oracle 10g後就是如此了(關於9i的版本還沒有詳細的測試資訊,以後有測試資訊補上)

預設建立tabledbms_metadate.get_ddl得到的資訊。

CREATE TABLE "XIAOYU"."TEST0001"

( "ID" NUMBER,

"NAME" VARCHAR2(10)

) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)

TABLESPACE "USERS"

關於ITL是什麼,運用dmp資料塊檢視:

SQL> delete from test0001;

2 rows deleted

Block header dump: 0x01009fbf

Object id on Block? Y

csc: 0x00.9ae330b4 itc: 2 flg: E

brn: 0 bdba: 0x1009fb9 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x0004.022.0000017d 0x00800aaa.0160.1a C--- 0 scn 0x0000.9ae327db

0x02 0x0001.021. .. ---- 2 fsc 0x000e.00000000

這裡先說明下上面的seg/obj: 0xcbe4,這個是sys.obj$基表中的obj#編號,可以轉化為16進位制檢視下是否

ITL是連線的事務槽編號,Xid這個是事務ID,其實可以分為三份,usn佔用回滾段編號,slotseq,都用16進位制替代,可以用to_number16進位制轉化為10進位制然後檢視是否存在於sys.obj$(網友提到了oracle是根據obj$檢視物件是否存在),在看看typ: 1 – DATA代表是存放資料的表段,如果是索引type就是2了,如下:

dump的索引塊)*** 2012-04-27 23:37:16.334

Start dump data blocks tsn: 4 file#: 4 minblk 1731 maxblk 1731

buffer tsn: 4 rdba: 0x010006c3 (4/1731)

scn: 0x0000.000990eb seq: 0x01 flg: 0x04 tail: 0x90eb2301

frmt: 0x02 chkval: 0x6326 type: 0x23=PAGETABLE SEGMENT HEADER

#blocks in seg. hdr's freelists: 0

#blocks below: 1

mapblk 0x00000000 offset: 0

Level 1 BMB for High HWM block: 0x010006c1

Level 1 BMB for Low HWM block: 0x010006c1

--------------------------------------------------------

Segment Type: 2 nl2: 1 blksz: 8192 fbsz: 0

這裡也告誡自己和大寫多動手,雖然很簡單的查詢多動手印象深刻!

SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarecstatus from v$transaction;

XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS

---------- ---------- ---------- ---------- ---------- ---------- ----------------

1 33 376 2 17 227 43

ACTIVE

SQL> select to_number('00000178','xxxxxxxx') from dual;

TO_NUMBER('00000178','XXXXXXXX

------------------------------

376

而其中的lck也就鎖住的rows數量,scn/fsc是快速提交或延遲提交的scn,看出此時事物沒有提交,所佔用的ITL 0x02,關於flag的標識:----代表事物是活動的,或者提交正在進行快清除;C—代表事物已經提交併且快清除完成;--U-事物提交(可能很久以前);scn是一個上限值;--T-事物依然活動的,在進行塊清楚(transaction was still active at block cleanout SCN),--B- this undo record contains the undo for this ITL entry

而其中的uba,先取前十位也就是0x00800011,轉換為2進位制再取出前10位也就是回滾段的檔案號,剩下的就是dba也就是資料庫編號,00e3ubasqn,而2b則是ubarec

繼續摘要一部分dump的內容:

data_block_dump,data header at 0x9102264

===============

tsiz: 0x1f98

hsiz: 0x16

pbl: 0x09102264

bdba: 0x01009fbf

76543210

flag=--------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1f86

avsp=0x1f70

tosp=0x1f82

0xe:pti[0] nrow=2 offs=0

0x12:pri[0] offs=0x1f8f

0x14:pri[1] offs=0x1f86

--- tsiz: hsiz: pbl: bdba: 在資料檔案都是沒有儲存的
--- tsiz:
除了上面的3部分和block尾部的4個位元組剩下的空間 0x1fb8就是8120位元組 8kblock:
--- 8192-20(block head)-24(Transaction Header)-24(
一個事務條)-4(block tail)=8120
--- hsiz:
資料塊頭20個位元組+資料塊尾4個位元組=24位元組(0x14)
--- pbl: ptr to buffer holding the block
我是用的專用模式dumpdatafile中的block出來
---
在同一個sessiondump檔案中 dump 出來的block 的這個都是同一個值
--- bdba:
和第一部分中的rdba 一個意思
--- flag 1 byte N=pctfree hit(clusters), F=don't put on free list
--- K=flushable cluster keys.
當然還有別的標記: A ...
--- ntab 1 byte
block中有幾個table的資料 cluster這個就可能大於1
--- nrow 2 bytes block
中有多少行資料
--- frre 2 bytes First free row index entry. -1=you have to add one.
--- fsbo 2 bytes Free Space Begin offset
--- fseo 2 bytes Free Space End offset
--- avsp 2 bytes Available space in the block
--- tosp 2 bytes Total available space when all TXs commit
--- 0xe: nrow 2 bytes block
中的這個table有多少行資料
--- 0xe: offs 2 bytes
偏移量 cluster 的時候可以看出值

block_row_dump:

tab 0, row 0, @0x1f8f

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 1, @0x1f86

tl: 2 fb: --HDFL-- lb: 0x2

end_of_block_dump

End dump data blocks tsn: 4 file#: 4 minblk 40895 maxblk 40895

--- tl: 這條記錄中的長度 包括row head 的一般情況的 3 位元組和表示資料長度的1位元組和資料本身的長度
--- fb: 1 byte K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
--- C = Cluster table member
--- H = Head piece of row
--- D = Deleted row
--- F = First data piece
--- L = Last data piece
--- P = First column continues from previous piece
--- N = Last column continues in next piece
--- lb: 1 byte
和上面第三部分的 ITL lck相對應 表示這行是否被 lock
--- cc: 1 byte
表示這行有幾列資料
--- col 0: [ 2] : 1 byte
表示這行的這列的長度
--- c1 02 :
這就是table中的資料 "1" 可以透過下面的語句看 oracle真正使用的是
---
那些16進位制的資料來表示的使用者資料 select dump(col_name,16) from table_name;(不過個人並沒有看見cc col0 c1 02等資訊,關於資料塊下面延伸的確實有點難以理解,個人也是慢慢對著慢慢理解的。)

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1058058/,如需轉載,請註明出處,否則將追究法律責任。

相關文章