/***oracle dsi 401 block结构****/
1,data block分成3部分:
cache layer
transaction layer
data layer
2,rowid 2种使用途径
1,基于索引的扫描
2,正常访问不能提取表数据(如表块损坏),可基于rowid提取数据
3,rowid解析
1,solaris有一个工具rowid工具,直接可以解析rowid各组个含义
4,block dump
有2种方法;
1,直接采用os最原始的dump
2,oracle dump
1,直接采用os最原始的dump
基于unix dd工具
示例:dd if=system01.dbf bs=4k skip=99 count=3|od -xv>file.out
dd各选项语义:
if ---dump文件名
bs ---oracle 数据库大小
skip ---偏移多少数据块
count --dump多少数据块
od --八进制工具
x --转化八进制为十六进制
v --详细输出,如无此选项,相同的行皆替代的*
还要最重要的一点:dd的=两边不能有空格
5,block layout
type
format
filler
rdba
scnbase
scnwrap
seq --基于同一个scn的递增序列号
flag --新块,延迟块,临时块等
checkvalue --用于验证
data block body
tail --用于验证数据块的完整性,由scnbase的低2byte+block type+scn seq
(注:如果基于同一个scn变更了245次,如果下次变更会分配一个新的scn
在11g,如果基于同一个scn对数据库更新245次,再有新的更新,scn不会重设置为新的scn)
dd产生的dump文件
1,切记od会自动添加一个offset列,此列为八进制,它并非是dump文件一部分内容
----------------------------------------------------------------------------------------
seg/obj --seg/obj id
csc : --最新一次块清清除的scn
itc ---itl slots的编号
flag ---在freelist块的的状态
typ --数据块的类型,data or index
fsl --11g deprecated,itl tx freelist slot
fnx ---在freelist上的下个数据块的dba
itl --itl index
xid ---事务id,由undo seg.slot.wrap
uba --undo地址,由undodba.seqno.recordno
flg --c=commited;u=commit upper bound;t=active at csc
lock --事务锁定记录数
scn/fsc --scn=事务提交的scn;fsc=free space credit(bytes)
注:如表空间用用自动段空间管理方式,则fsl和fnx会被dba range number,opcode,第一个位图块dba和数据块的incarnation number替代
基于上述上个示例:
Block header dump: 0x028b583b
Object id on Block? Y
seg/obj: 0x114a1 csc: 0x00.b0be29 itc: 2 flg: E typ: 1 - DATA --scn未发变化
brn: 0 bdba: 0x28b5838 ver: 0x01 opc: 0
inc: 0 exflg: 0
/******数据部分*******/
data_block_dump,data header at 0x19fd8264
===============
tsiz: 0x1f98 --数据的总大小
hsiz: 0x18 --数据块的块头大小
pbl: 0x19fd8264 --数据块所属缓冲的指针
76543210
flag=-------- --N表示pctfree hit(cluster);F表示未在free list;K表示可刷新的cluster keys
ntab=1 --数据块包含的表个数,如是cluster,则>1
nrow=3 --数据块包含的记录数
frre=-1 --第一个空闲记录索引条目,-1表示必须要添加一个
fsbo=0x18 --空闲空间的开始偏移量
fseo=0x1023 --空闲空间结束偏移量
avsp=0x1f65 --数据块中的可用空间
tosp=0x1f65 --数据块中所有事务提交后的全部可用空间
0xe:pti[0] nrow=3 offs=0 --nrows表示第一个表的记录数
0x12:pri[0] offs=0x102f --offs表示每条记录的偏移地址
0x14:pri[1] offs=0x1029
0x16:pri[2] offs=0x1023
/*****表记录部分dump**********/
block_row_dump:
tab 0, row 0, @0x102f --这个@前缀即上述的offs的行所在的偏移地址
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1 --tl为记录大小,由byte数加上数据
col 0: [ 2] c3 03 ---col为表中列的真正数据
tab 0, row 1, @0x1029
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1 --lb为lock byte,即表明itl事务是否锁住此记录,值1 为未提交,0 为提交
col 0: [ 2] c3 03
tab 0, row 2, @0x1023
--fb表示flag byte,H=head of row piece;K=cluster key;c=cluster table member;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;
/***在一个数据块中有data piece的概念***/
tl: 6 fb: --H-FL-- lb: 0x0 cc: 1 --cc表示行中多少个列
col 0: [ 2] c3 03
tab 0, row 3, @0x101c
tl: 7 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 3] c2 2d 2d
end_of_block_dump
/***unix提从了ascii到hex的转换,可以man ascii***/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-757718/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-757718/