ITPub博客

首页 > 数据库 > 数据库开发技术 > 数据文件internal分析

数据文件internal分析

原创 数据库开发技术 作者:foreverlee 时间:2005-04-07 16:04:40 0 删除 编辑
http://www.cnoug.org/viewthread.php?tid=1201&highlight=%2Bparrotao[@more@]

――――――――――――――――――――――――――――――――――
  *** 2003-06-12 11:36:22.437
*** SESSION ID:(12.96) 2003-06-12 11:36:22.343
Start dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2
buffer tsn: 8 rdba: 0x02c00002 (11/2)
scn: 0x0000.001148eb seq: 0x01 flg: 0x00 tail: 0x48eb1001
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
  
   Extent Control Header
   -----------------------------------------------------------------
   Extent Header:: spare1: 0      space2: 0      #extents: 1      #blocks: 4     
                   last map  0x00000000  #maps: 0      offset: 4128  
       Highwater::  0x02c00004  ext#: 0      blk#: 1      ext size: 4     
   #blocks in seg. hdr's freelists: 1     
   #blocks below: 1     
   mapblk  0x00000000  offset: 0     
                    Unlocked
      Map Header:: next  0x00000000  #extents: 1    obj#: 25755  flag: 0x40000000
   Extent Map
   -----------------------------------------------------------------
    0x02c00003  length: 4     
   
   nfl = 1, nfb = 1 typ = 1 nxf = 0
   SEG LST:: flg: USED   lhd: 0x02c00003 ltl: 0x02c00003 
End dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2
――――――――――――――――――――――――――――――――――
这里我们看到表空间号是tsn: 8,数据文件号是file#: 11,相对数据块地址是rdba: 0x02c00002 (11/2),SCN为scn: 0x0000.001148eb(SCN Base=0011,SCN Wrap=48eb),尾区版本号为tail: 0x48eb1001(tail=SCN Wrap: 48eb + type: 0x10+ seq: 0x01),由于这个块是整个Segment的头,所以它还包含整个Segment的一些存储信息,比如extent数,block数,高水位地址Highwater::  0x02c00004,自由列表信息hdr's freelists: 1等等。如果才用本地管理表空间,则此块的存储信息通过位图方式管理。
真正的数据是储存在下一个块也就是0x02c00002+1=0x02c00003,我们来看看究竟。
――――――――――――――――――――――――――――――――――
*** 2003-06-12 12:00:41.781
Start dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
buffer tsn: 8 rdba: 0x02c00003 (11/3)
scn: 0x0000.001148ee seq: 0x01 flg: 0x02 tail: 0x48ee0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
  
Block header dump:  0x02c00003
  Object id on Block? Y
  seg/obj: 0x649b  csc: 0x00.1148eb  itc: 1  flg: O  typ: 1 - DATA
      fsl: 0  fnx: 0x0 ver: 0x01
  
  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.03f.000000da    uba: 0x00800ad2.00ae.04  --U-    2  fsc 0x0000.001148ee
  
data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x16
pbl: 0x0ec77444
bdba: 0x02c00003
flag=-----------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1fac
avsp=0x1f90
tosp=0x1f90
0xe:pti[0]  nrow=2  offs=0
0x12:pri[0]  offs=0x1fb2
0x14:pri[1]  offs=0x1fac
block_row_dump:
tab 0, row 0, @0x1fb2
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1fac
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
――――――――――――――――――――――――――――――――――
谜团解开了,ITL,数据都呈现出来了,开始分析!
Block header dump:  0x02c00003
  Object id on Block? Y
  seg/obj: 0x649b  csc: 0x00.1148eb  itc: 1  flg: O  typ: 1 - DATA
      fsl: 0  fnx: 0x0 ver: 0x01
 
数据块地址正是0x02c00002+1=0x02c00003
segment/object id为0x649b,转成10进制为25755,可以由obj#表中得知
SQL> select obj# from sys.obj$ where name='TESTBLOCK';
 
       OBJ#
----------
      25755
 
csc(SCN at last Block CleanOut): 0x00.1148eb表示最后一次块清除(Block CleanOut)时候的SCN,关于块清除的概念可以查阅Thomas Kyte 著的”expert one by one Oracle”。
 
itc: 1 表示Number of itl slots
 
flg: O 表示此块被放置在自由列表(freelist)中
 
typ: 1 – DATA,类型1表示数据,类型2表示索引
 
fsl: 0 ITL TX FREELIST SLOT
 
fnx: 0x0 自由列表中下一块的地址

――――――――――――――――――――――――――――――――――
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.03f.000000da    uba: 0x00800ad2.00ae.04  --U-    2  fsc 0x0000.001148ee
这个事务列表中当前有一个事务,里面记载着slot号,事务id,undo block address,受影响的行数,事务递交时的scn等
Itl slot =0x01 
 
事务id= xid:  0x0006.03f.000000da
由于xid由3部分组成,xid= Undo Segment Number +Transaction Table Slot Number+ Wrap ,得到
0x0006 – Undo Segment Number  03f – Transaction Table Slot Number 000000da– Wrap 
 
回滚块地址=uba: 0x00800ad2.00ae.04
由于uba由3部分组成,uba= Address of the last undo block used+ Sequence+ Last Entry in UNDO record map得到
0x00800ad2– Address of the last undo block used  00ae– Sequence 04– Last Entry in UNDO record map 
 
flag标志我引用www.ixora.com.au的一段解释,这里的--U-表示已经递交
---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN
Lck(number of rows affected by this transaction)表示这个事务所影响的行数,这里是2行,正好对应2次insert
 
Scn/Fsc 标志我引用www.ixora.com.au的一段解释
If the transaction has been cleaned out, this is the commit SCN or an upper bound thereof. Otherwise the leading two bytes contain the free space credit for the transaction - that is, the number of bytes freed in the block by the transaction

―――――――――――――――――――――――――――――――――――――――
data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x16
pbl: 0x0ec77444
bdba: 0x02c00003
flag=-----------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1fac
avsp=0x1f90
tosp=0x1f90
0xe:pti[0]  nrow=2  offs=0
0x12:pri[0]  offs=0x1fb2
0x14:pri[1]  offs=0x1fac
―――――――――――――――――――――――――――――――――――――――――
这一部分记载着一些储存参数,简单得分析一些,给出各个标志的解释
tsiz:Total Data Area Size(数据块的大小)
hsiz:Data Header Size(数据块头大小)
pbl: ptr to buffer holding the block(指向这个数据块在内存中映象的指针)
bdba: block dba / rdba(数据块地址)
flag: n=pctfree hit (clusters),f=dont put on freelist k=flushable cluster keys
ntab: number of tables (>1 is a cluster)
nrow: number of rows
frre: first free row index entry, -1=you have to add one(没有创建索引)
fsbo: free space begin offset(从hsiz开始)
fseo: free space end offset()
avsp: available space in the block(可用空间)
tosp: total available space when all txs commit
0xe:pti[0]  nrow=2  offs=0本块储存2条记录
0x12:pri[0]  offs=0x1fb2---- 记录的起始物理位置

―――――――――――――――――――――――――――――――――――――――――
终于见到到数据了,这个部分就存储着对应的记录,继续分析
block_row_dump:
tab 0, row 0, @0x1fb2 
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1 
col  0: [ 2]  c1 02
tab 0, row 1, @0x1fac
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
―――――――――――――――――――――――――――――――――――――――
tl表示Row Size(number of bytes plus data)
fb:Flag Byte
    H-head of row piece
    F-first data piece 
    L-last data piece 
Lb表示lock byte,表示这个事务在itl的入口
Cc表示number of columns in this Row piece,表示这一行只有1列
col  0: [ 2]  c1 02 第一列,[2]表示长度,c1 02是数据(经过一套复杂的过程可以转换成10进制数据)
到此为止,数据块的结构我们已经都把它展开并进行了分析,期待大家的继续!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/76065/viewspace-795290/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-11-26

  • 博文量
    72
  • 访问量
    1356203