N,.
0c07495f 49434f4c 31ff02c1 2902c129 l ..I_ICOL1...)..)
05494e44 45580778 6e041409 191d0778 l .INDEX.xn......x
6e041409 191d1332 3031302d 30342d32 l n......2010-04-2
303a3038 3a32343a 32380556 414c4944 l 0:08:24:28.VALID
014e014e 014e2c00 0c07495f 43444546 l .N.N.N,...I_CDEF
31ff02c1 3302c133 05494e44 45580778 l 1...3..3.INDEX.x
6e041409 191d0778 6e041409 191d1332 l n......xn......2
3031302d 30342d32 303a3038 3a32343a l 010-04-20:08:24:
32380556 414c4944 014e014e 014e2c00 l 28.VALID.N.N.N,.
<16 bytes per line>
BBED> modify /c abcde
Warning: contents of previous BIFILE will be lost. Proceed (Y/N) y
File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
Block: 20 Offsets: 4223 to 4734 Dba:0x01400014
------------------------------------------------------------------------
61626364 655f524f 4c455f44 41544124 5f32ff02 c11c02c1 1c05494e 44455807
786e0414 09191d07 786e0414 09191d13 32303130 2d30342d 32303a30 383a3234
3a323805 56414c49 44014e01 4e014e2c 000c0749 5f555345 5223ff02 c10c02c1
0c05494e 44455807 786e0414 09191d07 786e0414 09191d13 32303130 2d30342d
32303a30 383a3234 3a323805 56414c49 44014e01 4e014e2c 000c0649 5f434f4c
31ff02c1 2e02c12e 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00
0c07495f 43434f4c 32ff02c1 3802c138 05494e44 45580778 6e041409 191d0778
6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a 32380556 414c4944
014e014e 014e2c00 0c07495f 43444546 33ff02c1 3502c135 05494e44 45580778
6e041409 191d0778 6e041409 191d1332 3031302d 30342d32 303a3038 3a32343a
32380556 414c4944 014e014e 014e2c00 0c07495f 49434f4c 31ff02c1 2902c129
05494e44 45580778 6e041409 191d0778 6e041409 191d1332 3031302d 30342d32
303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00 0c07495f 43444546
31ff02c1 3302c133 05494e44 45580778 6e041409 191d0778 6e041409 191d1332
3031302d 30342d32 303a3038 3a32343a 32380556 414c4944 014e014e 014e2c00
<32 bytes per line>
SQL> alter system flush buffer_cache;
System altered.
SQL> select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where rownum < 9;
select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where rownum < 9
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 20)
ORA-01110: data file 5: '/home/app/oraten/oradata/oraten/tbs101.dbf'
而对物理损坏的修复也非常简单( 上面修改的并不是第7条记录):
BBED> sum apply
Check value for File 5, Block 20:
current = 0xb5e0, required = 0xb5e0
SQL> alter system flush buffer_cache;
System altered.
SQL> select object_name,dbms_rowid.rowid_block_number(rowid) from t1 where object_name like '%abcde%';
OBJECT_NAME DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------ ------------------------------------
I_abcde_ROLE_DATA$_2 20
对于逻辑损坏的模拟,确实比较麻烦,因为只有oracle才知道数据块的内部逻辑结构。今天我们尝试模拟一种逻辑错误。我们指定oracle的数据是以row为单位存储在数据块中的,而每个row的第一个byte具有特殊含义,该字节的每一个位都表示不同的含义,如下图
html\wpsEFAC.tmp.png" width="554" />
如果我们通过bbed手工修改该byte的存储内容,那么oracle就有可能不能很好的识别该条记录,从而引发逻辑错误。
BBED> set file 5
FILE# 5
BBED> set block 20
BLOCK# 20
BBED> map /v
File: /home/app/oraten/oradata/oraten/tbs101.dbf (5)
Block: 20 Dba:0x01400014
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
ub1 type_kcbh @0
ub1 frmt_kcbh @1
ub1 spare1_kcbh @2
ub1 spare2_kcbh @3
ub4 rdba_kcbh @4
ub4 bas_kcbh @8
ub2 wrp_kcbh @12
ub1 seq_kcbh @14
ub1 flg_kcbh @15
ub2 chkval_kcbh @16
ub2 spare3_kcbh @18
struct kt