首页 > 数据库 > Oracle > 关于block的ITL和dump的扩展
关于block的ITL,数据块在创建时默认会在每个block中分配两个ITL,也就是initrans,会有list,最大允许有255 Interested Transaction List,也就是block上的maxtrans。而initrans为2是初始分配给block的,虽然经过dbms_metadata.get_dll查看初始分配了initrans 1,其实大家可以在创建后dump块看看,初始分配了两个,而即使手动定义的maxtrans 2在10g下已经失去了意义,oracle一样会初始分配2个ITL,最大允许255个ITL。
注:oracle 9i推出了自动段空间管理,使block中的fctused参数失效,因为不再用freelists管理段内的空间,避免了segment头的单个freelist竞争,而改为位图管理extent的free use信息。不过关于ITL的分配个人经过测试无论在手动还是自动段空间管理下,oracle初始都会分配两个initrans,最大到255maxtrans,这在oracle 10g后就是如此了(关于9i的版本还没有详细的测试信息,以后有测试信息补上)
默认创建table用dbms_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 typ: 1 - DATA
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占用回滚段编号,slot和seq,都用16进制替代,可以用to_number把16进制转化为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,ubarec,status 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也就是数据库编号,00e3是ubasqn,而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字节 8k的block:
--- 8192-20(block head)-24(Transaction Header)-24(一个事务条)-4(block tail)=8120
--- hsiz: 数据块头20个字节+数据块尾4个字节=24字节(0x14)
--- pbl: ptr to buffer holding the block 我是用的专用模式dump的datafile中的block出来
--- 在同一个session的dump文件中 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
--- 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等信息,关于数据块下面延伸的确实有点难以理解,个人也是慢慢对着慢慢理解的。)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1058058/ ,如需转载,请注明出处,否则将追究法律责任。