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] |