打印本文 打印本文 关闭窗口 关闭窗口
oracle block 格式
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3009  更新时间:2009/4/22 22:08:00  文章录入:mintao  责任编辑:mintao
sp;            0x0e         -        0x07           Y
---                           0x0f         0        0x07           Y
---                           0x10 ... 类似上面的循环了   这种情况在9i上已经改变因为ASSM的出现
--- 00                :   fsl: 0
--- 00 00 00 00       :   fnx: 0x0

------------------------  下面的对应上面dump 文件的第三部分

                                                03 00 45 00  
00006030   B4 00 00 00 0A 17 80 00  C7 00 36 00 01 20 00 00  
00006040   A5 02 08 00

--- 03 00 45 00 B4 00 00 00  :   xid:  0x0003.045.000000b4
--- 0A 17 80 00 C7 00 36 00  :   uba:  0x0080170a.00c7.36
--- 01  0                    :   Lck   锁定的row数 这里还用到了下一个 byte 的数据
--- 2                        :   Flag  2 对应的二进制表示为 0010 正好和dump文件中的 --U- 吻合
--- 00 00 A5 02 08 00        :   Scn/Fsc

------------------------  下面的对应上面dump 文件的第四部分

                       00 01 01 00  FF FF 14 00 B2 1F 9B 1F  
00006050   9B 1F 00 00 01 00 B2 1F  

--- 00               :   flag
--- 01               :   ntab
--- 01 00            :   nrow
--- FF FF            :   frre
--- 14 00            :   fsbo
--- B2 1F            :   fseo
--- 9B 1F            :   avsp
--- 9B 1F            :   tosp
--- 00 00            :   0xe: offs
--- 01 00            :   0xe: nrow
--- B2 1F            :   0x12:pri[0] offs=0x1fb2

------------------------  下面的对应上面dump 文件的第五部分

--- 这部分和上面的数据中间省略了很多 因为这列子中这些部分没存储数据

00007FF0   00 00 00 00 00 00 2C 01  01 02 C1 02

--- 这是 block 中存用户数据的地方
--- 2C     :    fb:
--- 01     :    lb: 这一行是否被lock
--- 01     :    这条记录中有多少列的数据  从这里看出因为只用一个byte去记录这一行有多少列
---               所以最多是255列 但一个表可以最多是1000列 如果table 的列大于255列 这里就会
---               发生链接 根据一行记录的长度来看是 块内的链接或者是块与块直接的链接
---               这也是为什么table 的设计会尽量少于255列的原因
--- 02     :    第1列的数据的长度是多少
--- C1 02  :    存储在 block 中的数据 "1"

------------------------  下面的对应上面dump 文件的第一部分的 "tail: 0x02a50601"
                                                01 06 A5 02 
--- 这是用来效验 block 是否完整的标志 改这 block 最后的4 bytes 数据中的任意肯定ora-1578

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上面只是讲解了一个最简单的oracle 的block 的格式 其他还有很多的情况 如 cluster , index 等
long , lob , long raw 这些在 block 中的表示因为数据长度的不同都会有不同的体现

有的时候改动block 中的任意数据不一定会发生 ORA-01578 因为下面的两个参数没有设置为 true
db_block_checking    db_block_checksum   
这两个参数对于system tablespace 默认都是true 所以改变 system tablespace 中的
数据肯定会发生ORA-01578
随着oracle版本的不断升级 oracle 对block中存储数据的正确性也在不断的提升要求 而且通过常规的
手段想去了解 oracle block 的格式也可能越来越困难

上一页  [1] [2] [3] [4] 

打印本文 打印本文 关闭窗口 关闭窗口