坏两种,那么当oracle发现物理或者逻辑损坏之后是如何标记数据块从而使之后的操作知道该块是损坏块的那?
对于物理损坏,oracle不会进行任何的处理,在进行后续处理时oracle会重新计算checksum,只要发现checksum不一致则认为该块时物理损坏,并抛出01578错误。
对于逻辑损坏,当oracle第一次对数据块进行逻辑检测时,会抛出ora 600等错误,并修改数据块中的标记位,当下次访问该数据块时,oracle检测标志位,如果发现标志位以置为逻辑损坏,则抛出ora 01578错误。当使用DBMS_REPAIR对坏块进行修改时,如果时物理损坏不作任何处理,如果时逻辑损坏,修改数据块的标志位。
在数据块中存在两个位置表示数据块为逻辑损坏(不标示物理损坏),如下:
BBED> map /v
File: /home/app/oraten/oradata/oraten/tbs201.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 ktbbh, 96 bytes @20
ub1 ktbbhtyp @20
union ktbbhsid, 4 bytes @24
struct ktbbhcsc, 8 bytes @28
b2 ktbbhict @36
ub1 ktbbhflg @38
ub1 ktbbhfsl @39
ub4 ktbbhfnx @40
struct ktbbhitl[3], 72 bytes @44
struct kdbh, 14 bytes @124
ub1 kdbhflag @124
b1 kdbhntab @125
b2 kdbhnrow @126
sb2 kdbhfrre @128
sb2 kdbhfsbo @130
sb2 kdbhfseo @132
b2 kdbhavsp @134
b2 kdbhtosp @136
struct kdbt[1], 4 bytes @138
b2 kdbtoffs @138
b2 kdbtnrow @140
sb2 kdbr[7] @142
ub1 freespace[7905] @156
ub1 rowdata[127] @8061
ub4 tailchk @8188?
BBED> set offset 14
OFFSET 14
BBED> dump /v count 12
File: /home/app/oraten/oradata/oraten/tbs201.dbf (5)
Block: 20 Offsets: 14 to 25 Dba:0x01400014
-------------------------------------------------------
ff0425fe 00000100 0000fcca l ..%.........
<16 bytes per line>
BBED> set offset 8188
OFFSET 8188
BBED> dump /v count 12
File: /home/app/oraten/oradata/oraten/tbs201.dbf (5)
Block: 20 Offsets: 8188 to 8191 Dba:0x01400014
-------------------------------------------------------
ff060000 l ....
这里的ff即标示数据块位逻辑损坏块,我们可以将其手工修改位01 或者 02 从而取消逻辑损坏标示。??
对于已经标示为逻辑损坏的数据块,dbv等工具的检测结果如下:
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
而对于没有标示的逻辑损坏,dbv等工具检测结果如下:
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 1
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
于物理损坏,dbv检测结果如下
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 1
Total Blocks Influx : 0
对于dbms_repair包,如果是物理损坏,则REPAIR_TABLE的marked_corrupt列始终为true,fix方法并不会发生作用。对于逻辑损坏,首先repair_table 的marked_corrupt列为false,fix方法修正后,marked_corrupt修改为true,此时数据块的标志位已发生修改。