在AUL/MyDUL中如何处理坏块/死块?

    在Oracle中偶儿会遇到坏块而不能读取的情况, 这时我们首先要想到的是从备份中恢复. 当有一个坏块时, 你就应当用RMAN或DBV去检查整个文件, 它们可以帮助你找出这个文件中所有的坏块. 在AUL/MyDUL中, 坏块并不一定是不能恢复的, 只有那些引起了AUL/MyDUL程序异常退出的坏块(已经遇到过几次了)才是问题, 异常退出通常是因为程序访问内存出了边界. 对于这些块我将他们命名为死块, 处理这种块时需要额外的步骤.

    首先是要将他们找出来, 通过设置"set verbose 1"这样的调试命令, AUL/MyDUL会在屏幕上打印出当前正在处理的块的地址(RDBA). 当程序退出时, 我们只需要将最后一行中的块地址标记为死块就行了, 然后重新开始恢复. 如果数据文件中有多个这样的块, 我们可能要这样进行好多个回合. 如下所示:

AUL> set verbose 1
  Current VERBOSE is : 1
AUL> unload table mydul.t_lob to t_lob.txt;
2006-08-12 14:11:15
Unload OBJD=9946 FILE=4 BLOCK=219 CLUSTER=0 ...
Recover rows from RDBA=16777436 ...
Recover rows from RDBA=16777437 ...
Recover rows from RDBA=16777438 ...
Recover rows from RDBA=16777439 ...
Recover rows from RDBA=16777440 ...
<< program aborted here>>

    接下来我们将这一个块标记为坏块, 然后重新开始恢复:

AUL> corrupt rdba 16777440
AUL> corrupt list
Corrupted Blocks List:
  RDBA = 16777440 , FILE = 4 , BLOCK = 224
AUL> unload table mydul.t_lob to t_lob.txt;
2006-08-12 14:13:46
Unload OBJD=9946 FILE=4 BLOCK=219 CLUSTER=0 ...
Recover rows from RDBA=16777436 ...
Recover rows from RDBA=16777437 ...
Recover rows from RDBA=16777438 ...
Recover rows from RDBA=16777439 ...
Recover rows from RDBA=16777440 ...
Block check failured at RDBA=0x010000e0=16777440
Recover rows from RDBA=16777553 ...
Recover rows from RDBA=16777554 ...
2006-08-12 14:13:49

    有"Block check failured ..."的这一行表示AUL/MyDUL在恢复时跳过了这一个块. 下载试试吧!

发表留言: