oracle 块故障恢复

故障块种类:

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

oracle 块故障恢复_第1张图片

 4:DBMS_REPAIR.DUMP_ORPHAN_KEYS过程来保存坏块中的索引键值

 再查询ORPHAN_KEY_TABLE就会有相关的键值,这里表相关的索引都要做这个操作。
5:DBMS_REPAIR.REBUILD_FREELISTS修复FREELISTS

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,数据转换后,再插入到丢失数据的表中。

你可能感兴趣的:(oracle 块故障恢复)