查看数据块的校验码(注意:我的机器的endian format为little)
数据块头尾校验值组成是:
数据块的 SEQ(offset 14 开始的 1个字节)+ 数据库类型(offset 0开始的 1个字节)+
最低 SCN_BASE( 注意:如果操作系统的endian format 为 little,则从offset 8开始的2个字节,
如果endian format 为 big,则从offset 10 开始的2个字节)组成
下面我们一一查看各个值
数据块头尾校验值 = 数据库SEQ值 + 数据块类型 + 最低SCN_BASE
01063a04 = 01 + 06 + 3a04
注意:如果出现坏块,则:
数据块头尾校验值 != 数据库SEQ值 + 数据块类型 + 最低SCN_BASE
因此,可以使用bbed修改 数据块头尾校验值 让他和 (数据库SEQ值 + 数据块类型 + 最低SCN_BASE)值一样
(提醒:慎用bbed)
校验码的位置在数据块的 第 16、17两个字节
BBED> set dba 1, 42
DBA 0x0040002a (4194346 1,42)
BBED> set offset 16 count 2
OFFSET 16
COUNT 2
BBED> dump
File: /u01/app/oracle/oradata/normal/system01.dbf (1)
Block: 42 Offsets: 16 to 17 Dba:0x0040002a
------------------------------------------------------------------------
bdef --这就是校验码的值(check sum)——需要倒过来 bdef -> efbd
BBED> sum apply
Check value for File 1, Block 42:
current = 0xefbd, required = 0xefbd --这里的值就是上面dump出来的值
数据块头尾校验,其校验值存放在数据块的 8818字节中,占4个字节。
数据块头尾校验值组成是:
数据块的 SEQ(offset 14 开始的 1个字节)+ 数据库类型(offset 0开始的 1个字节)+
最低 SCN_BASE( 注意:如果操作系统的endian format 为 little,则从offset 8开始的2个字节,
如果endian format 为 big,则从offset 10 开始的2个字节)组成
下面我们一一查看各个值
--数据库SEQ值
BBED> dump offset 14 count 1
File: /u01/app/oracle/oradata/normal/system01.dbf (1)
Block: 42 Offsets: 14 to 14 Dba:0x0040002a
------------------------------------------------------------------------
01
--数据块类型
BBED> dump offset 0 count 1
File: /u01/app/oracle/oradata/normal/system01.dbf (1)
Block: 42 Offsets: 0 to 0 Dba:0x0040002a
------------------------------------------------------------------------
06
--最低SCN_BASE
BBED> dump offset 8 count 2
File: /u01/app/oracle/oradata/normal/system01.dbf (1)
Block: 42 Offsets: 8 to 9 Dba:0x0040002a
------------------------------------------------------------------------
3a04
--数据块头尾校验值
BBED> dump offset 8188 count 4
File: /u01/app/oracle/oradata/normal/system01.dbf (1)
Block: 42 Offsets: 8188 to 8191 Dba:0x0040002a
------------------------------------------------------------------------
01063a04
上面验证了
数据块头尾校验值 = 数据库SEQ值 + 数据块类型 + 最低SCN_BASE
01063a04 = 01 + 06 + 3a04
注意:如果出现坏块,则:
数据块头尾校验值 != 数据库SEQ值 + 数据块类型 + 最低SCN_BASE
因此,可以使用bbed修改 数据块头尾校验值 让他和 (数据库SEQ值 + 数据块类型 + 最低SCN_BASE)值一样
(提醒:慎用bbed)