ITPub博客

首页 > 数据库 > Oracle > 关于block的ITL和dump的扩展

关于block的ITL和dump的扩展

原创 Oracle 作者:dotaddjj 时间:2012-04-27 23:27:16 0 删除 编辑

关于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
中的这个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博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1058058/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662967