目标:
在os级别将oracle的blocks给dump出来;
解释dump的格式;
比较os和格式化后的dumps;
在block中识别oracle7和oracle8的关键数据结构

RDBMS Data Blocks
RDBMS将数据存储在data blocks中;
一个block在物理数据库上占有特定的字节的空间;
空间的分配是以block的倍数分配的;
数据库的block的大小在数据库创建的时候确定,一旦创建了,就不能更改,除非重建数据库.所有的oracle的block都有同样大小的block大小,最大的block取决于操作系统的限制.oracle7和oracle8的block有不同的地方,但是8和8i没有什么区别;

data block的结构
一个oracle的data block有三个部分组成,分别是:
cache layer,transaction layer,data layer
cache layer包含有block的格式(oracle7或者是oracle8),类型(数据,索引,头以及其他)以及数据的先后顺序;
transaction layer存储和该block相关的事务的信息;
这个结构是数据库中任何一个block的开始.他可能表现为不一类block,这些并不被redo修改的.也可能表现为数据文件的头的block或者是控制文件的头的block.cache 头提供损坏数据的检查,通常用来确保正确的块被读取并且没有被错误的覆盖.一个断裂的block是部分的写入到磁盘,并且留下前期版本在block中的block.

ROWID和block dump
ROWID在block中是指向特定行的指针;
ROWID的内容根据版本不同而不同
  在oracle 7中:文件号,block号,row号
  在oracle 8中:增加了数据对象号,因为文件号对整个数据库并不唯一,只是对表空间唯一.
oracle 7的ROWID格式通常在oracle8继续使用,并且当做一个受限的ROWID格式.

ROWID的使用方法:
在数据是索引的时候,索引block报刊每个行的rowid,以便快速的访问数据;
也可以被用来在常规方法访问block失败的时候,从block中提取数据;

oracle 8受限的rowid格式为:BBBBBBBB.RRRR.FFFF
oracle 8的rowid格式为:OOOOOOFFFBBBBBBSSS
oracle 8和8i使用扩展的rowid格式来存储数据库中每一个行的地址.扩展的rowid对于分区表和分区索引和非分区表和索引一样有效.他支持表空间关联数据block地址.一个受限的rowid数据类型用来进行对存在的应用的向后兼容.
扩展的rowid使用64进制的编码来标记每一个选择出来的行的物理地址;
可以使用DBMS_ROWID报来获取关于rowid的所有信息.
你也可以找到data block号,对象号,以及其他的rowid的信息而无需写代码来转换rowid的格式.
例如
rowid_block_number函数通过输入的rowid返回数据库block号
同样可以有一个rowid包,能得到oracle8的rowid的对象号,关键文件号,block号以及行号,这个包是在solaris上开发的.

oracle block dump
可以通过两种方法来dump oracle block
通过操作系统包进行raw的dump
通过rdbms来dump出格式化的dump

从os级别dump oracle7和oracle8
在unix平台上,dd是用来dump block的命令
在使用dd的时候,在=号的前后不要有空格
语法: dd bs=db_block_size if=dbfile.dbf skip=(block-1) count=3 | od -xv >file.out
bs:block大小(对oracle来说,就是clock的大小,)
if:输入文件
skip:跳过的block数目
count:需要dump的block数目
od:unix的8进制dump包
-x:将输出文件转换为16进制;
-v:显示所有的输入数据,如果没有该选项,所有的输出行将被替换为一个星号.
例如:
你的alert.log中显示block100,文件好1有错误,你的TEAMA数据库是用4kb的block大小创建的,那么,你可以使用如下的命令来dump:
$ dd if=systemTEAMA01.dbf bs=4k skip=99 count=3 |od -xv >file.out
该例子将dump 99.100.101到名字为file.out的文件中.
注意:dd是读磁盘的,如果数据库在运行,要强制一个force来刷新脏数据到磁盘.

oracle 8的data block 规划

Typ:block类型;
Fmt:block的格式,oracle8是0×02.
filler:当前没使用;
RDBA:block关联的数据库地址;
SCNBase:基本的SCN
SCNWrap:SCN wrap
Seq:序列号,在同一个SCN中,每一个对block的更改都将递增;
Flg:标志

oracle 7的data block 规划

Typ:block类型
Ver:block的版本,oracle 7是0×01
Filler:暂时没用
DBA:block的数据库地址
Inc:在每一次block标记为新的的时候增加
Seq:block的序列号(是当前incarnation的改变版本)
ChkSum:是block内容的校验和;

oracle8和oracle7的block的对比:
oracle8在block头格式上有一些改变.incarnation和序列好被SCN号和序列号替代,IncSeq被tail替代,DBA被RDBA替代.序列号被分裂为SCNWrap,Sql和Flg.

type:block类型
1:undo segment header
2:undo data block
3:save undo header
4:save undo data block
5:data segment header(temp,index,data and so on)
6:KTB-manageed data block(with itl)
7:temp table data block(no itl)
8:sort key
9:sory run
10:segment free list block
11:data file header

oracle 8二进制(OS)dump
例如:dd bs=2k if=users01.dbf skip=12 count=3 | od -v >/tmp/file.out
需要注意的是,虽然数据是通过16进制输出,但是偏移量依然是使用8进制计算的.偏移量是通过od命令来增加的,并不是dump的一部分;

oracle格式的block dump
可以从RDBMS中dump出block
在user dump目录下的trace文件将包含dump的信息
oracle 8的语法:
alter system dump datafile 5 block 13;
oracle 7的语法:
alter session set events ‘immediate trace name blockdump level 67110390’
任何block dump都有一个block头.他决定了dump的格式,在dump文件的头部你可以看到block头信息.
Rdba:该block的关联DBA
Scn:SCN号码
Seq:序列号
  SEQ ->0 没有改变;
  SEQ ->(UB1MAXVAL-1)最大可能的序列号;
  SEQ ->(UB1MAXVAL)block被损坏了,值为FF.
Flg:标志
Tail:包含用来校验block的开头和结为是相同版本的信息(包含最低两个俄字节的SCNBase加上block类型加上SCN Seq号)
Frm:block格式,oracle8是2
Chkval:如果DB_BLOCK_CHECKSUM=TRUE将包含该block的校验
Type:block的类型
Rdba:关联的数据block地址
Seg/Obj:Seg/Obj ID
Csc:最后一个block的清除SCN
Itc:itl的数据
flg:0=在freelist上.
Typ:1=DATA;2=INDEX
Fsl:ITL TX freelist
Fnx:在freelist上的下一个block的DBA
Itl:有关的事务列表索引.
Xid:事务ID
Uba:Undo地址
Flg:C=Committed;U=commit Upper Bound;T=Active at CSC,B=在ITL的前映象的UBM的Rollback
Lck:该事务影响的行的数目;
Scn/Fsc:Scn=提交的TX的SCN;Fsc=信任的空闲空间.
Tsiz:所有的数据区大小;
Hsiz:数据头大小;
Pbl:指向在buffer中持有该block的指针;
Bdba:block关键的RDBA
Flag:N=pctfree 命中;F=不在freelist上,K=可刷新的聚合键;
Ntab:表的数目(在聚合表中>1)
Nrow:行的数目
Frre:第一个空闲的行的入口索引,-1表示必须增加一个.
Fsbo:空闲地址的开始偏移量;
Fseo:空闲地址的结束偏移量
Avsp:在block中的可用空间;
Tosp:当所有的TXcommit后的可用空间;
Nrow:第一个表的行数;

oracle8的data layer的block dump格式
Tab: Tab 0,row8,偏移量
Cc:该行中包含的列数;
Lb:锁类型 ITL入口表示行被锁定;
Fb:标志类型
  H=head of row piece;K=cluster Key;C=Cluster table member;D=Deleted row;          F=Fist data piece;L=last data piece ;P=First column continues from              previous piece;N=last column continues in next piece
Tl:行大小(数据相加的字节和)
Col:列数据;



 


Write a comment

You need tologin.