故障块种类:
1:物理故障块 比如:数据文件,控制文件,重做日志
2:逻辑故障块 比如:表块故障等等一系列逻辑结构
首先介绍几种检测故障块的方法:
1:dbv file=数据库文件路径+数据文件名称 blocksize=8192(默认)不能检查逻辑对象的错误,比如表,索引等等。
2:ANALYZE TABLE .. VALIDATE STRUCTURE CASCADE 用来分析表和索引的结构一致性,如果有坏块就会报错误
3:事件检测:10210(表)、10211(索引)和10212(簇)
4:DBMS_REPAIR oracle自带的包工具
以上工具大家可以自己实验一下,这里我介绍一个表块故障的案例:
发生表块故障首先要尽量挽救没有损坏的块的数据,如果有备份那当然好了,如果没有备份,看有镜像没,比如磁盘做了RAID1,可以将镜像的磁盘作为表的输出。这里要设置10231事件跳过故障块,之后产生一个指向潜在卷的新控制文件,如果故障块还不能恢复,再采取逻辑方法尝试救取数据块。
首先还是用10231事件或者DBMS_REPAIR 跳过故障块(非系统字典块),也可以在初始化参数中加event=‘10231 trace name context froever,level 10',启动数据库,然后select * from 表名(只有全表扫描可以跳过),就可以顺利查看跳过故障块的表了。
使用DBMS_REPAIR ,原理:将检查到的坏块标注,在随后的操作跳过标注的块。
使用SKIP_CORRUPT_BLOCKS跳过故障块,先查看查看dba_tables.skip_corrupt来查看跳过标记,
exec dbms_repair.skip_corrupt_blocks('username','tablename');还可以使用noskip关闭flags。
这个包的主要作用并不是让你来跳过坏块,而是恢复坏块。看包的名称就知道,repair嘛。
1:建立REPAIR_TABLE和ORPHAN_KEY_TABLE表
begin
dbms_repair.admin_tables(
table_name=>'repair_table',
table_type=>dbms_repair.repair_table,
action=>dbms_repair.create_action,
tablesapce=>'tablespace_name'>;
end;
/
begin
dbms_repair.admin_tables(
table_name=>'ORPHAN_KEY_TABLE',
table_type=>dbms_repair.orphan_table,
action=>dbms_repair.create_action,
tablesapce=>'tablespace_name'>;
end;
/
2:使用DBMS_REPAIR.CHECK_OBJECT检测坏块对象
再查询repair_table表,如果没有标记坏块,那么再执行FIX_CORRUPT_BLOCKS
4:DBMS_REPAIR.DUMP_ORPHAN_KEYS过程来保存坏块中的索引键值
begin
dbms.repair. REBUILD_FREELISTS(
schema_name=>'username',
objecgt_name=>'tablename';
object_type=>dbms.repair.table_object);
end;
/
6:使用DBMS_REPAIR.SKIP_CORRUPT_BLOCKS实现全表扫描时跳过坏块,同上
7:重建索引,这里过程忽略
8:数据恢复,这里注意只有索引列的数据可以恢复,这里需要自己写一个程序提取ROWID,数据转换后,再插入到丢失数据的表中。