ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 检测与恢复数据库的讹误

检测与恢复数据库的讹误

原创 Linux操作系统 作者:treesofthehill 时间:2012-05-23 17:26:51 0 删除 编辑

1          块讹误及其原因

块讹误即某个oracle文件(数据文件、联机日志文件、归档日志文件和控制文件)损坏。引起文件损坏有两种形式:

(1)       介质讹误:具体包括由磁盘损坏引起。

介质讹误块:是内容没有任何意义的数据块,这种数据块并不匹配oracle根据用于表空间及其内部对象的格式规则所期望的任何格式。

数据块格式化级数:

第一级:创建数据文件时,数据文件会被格式化为若干oracle数据块,并且还会为指定的表空间选择数据块的大小。

第二级:在实际使用数据块时,指定对象的高水印进入,出现特定段要求的特征。

介质讹误丢失了数据块的所有格式化级数。

(2)       逻辑讹误:具体包括由服务器I/O系统、内存错误和oracle自身的bug引起。

逻辑讹误块是oracle格式化正确,但是其内部内容不一致的数据块。

2          与块讹误相关的参数

(1)       Db_block_checksum参数

默认为TURE,有助于检测由磁盘或I/O系统引入的损坏。

DBWn进程进行数据写时,会计算这个数据块的校验和并将其包含在数据块的头部。

服务器进程进行数据读时,如果存在校验和,就会重新计算这个数据块的校验和并进行比较。

(2)       Db_block_checking参数

默认为FALSE,有助于检测由出错内存引入的损坏。

设置为TURE时,会对性能产生影响,会占用约10%的处理能力。

Oracle始终为SYSTEM表空间启用校验和计算以及数据块检查,与db_block_checksum参数和Db_block_checking参数无关。

3          检测块讹误

(1)       块讹误生成的错误信息

出现ORA-01578错误消息说明存在讹误数据块。

在告警日志中存在详细的信息:相关的文件、数据块号和讹误数据块的对象号(eg.52099)

可以使用以下命令标志对象:

Select owner,object_name,object_type from dba_objects where object_id=432978;

Select owner,segment_name,segment_type from dba_extents where file_id=8 and 6 between block_id and block_id + blocks;

(2)       DBVERIFY工具

DBVERIFY工具可以验证数据文件、sqlplus生成的备份操作和rman生成的映像副本,但不能验证联机或归档重做日志、控制文件和rman备份集。

E:\oracle\product\10.2.0\oradata\ORCL\DATAFILE>dbv file=O1_MF_USERS_7RBDDPSW_.DBF

 

DBVERIFY: Release 10.2.0.4.0 - Production on 星期三 5 23 15:46:28 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

DBVERIFY - 开始验证: FILE = O1_MF_USERS_7RBDDPSW_.DBF

 

 

DBVERIFY - 验证完成

 

检查的页总数: 12800

处理的页总数 (数据): 26

失败的页总数 (数据): 0

处理的页总数 (索引): 3

失败的页总数 (索引): 0

处理的页总数 (其它): 12758

处理的总页数 ()  : 0

失败的总页数 ()  : 0

空的页总数: 13

标记为损坏的总页数: 0

流入的页总数: 0

最高块 SCN            : 2398410 (0.2398410)

 

(3)       ANALYZE命令

ANALYZE命令的主要目的是收集优化器用于找出某条SQL最有效执行方式的统计量,但是还有一个用途:检查某个表或某个索引是否有讹误。

system@ORCL>analyze table t2 validate structure;

 

表已分析。

system@ORCL>analyze index SYS_C001396 validate structure;

 

索引已分析

system@ORCL>analyze table t2 validate structure cascade;

 

表已分析。

 

(4)       DBMS_REPARE程序包

DBMS_REPARE程序包是检查对象是否存在问题并使其再次可用的一组过程。

步骤:

1         创建REPAIR_CORRUPT_TAB表,用于将存储检查指定表时遇到的所有问题的详细信息。

sys@ORCL>exec dbms_repair.admin_tables(-

>       table_name=>'REPAIR_CORRUPT_TAB',-

>       table_type=>dbms_repair.repair_table,-

>       action=>dbms_repair.create_action);

 

PL/SQL 过程已成功完成。

2         调用CHECK_OBJECT过程,包含了存在讹误数据块以及被影响对象的详细信息。(检查T2是否存在讹误)

sys@ORCL>declare num_corrupt int;

  2     begin

  3             num_corrupt:=0;

  4             dbms_repair.check_object(

  5                     schema_name=>'SYSTEM',

  6                     object_name=>'T2',

  7                    repair_table_name=>'REPAIR_CORRUPT_TAB',

  8                     corrupt_count=>num_corrupt);

  9             dbms_output.put_line(num_corrupt);

 10     end;

 11     /

0---表示T2不存在讹误

 

PL/SQL 过程已成功完成。

3         调用FIX_CORRUPT_BLOCKS过程,将受损的数据块标记为讹误。

sys@ORCL>declare num_fix int;

  2     begin

  3             num_fix:=0;

  4             dbms_repair.fix_corrupt_blocks(

  5                     schema_name=>'SYSTEM',

  6                     object_name=>'T2',

  7                     object_type=>dbms_repair.table_object,

  8                    repair_table_name=>'REPAIR_CORRUPT_TAB',

  9                     fix_count=>num_fix);

 10     end;

 11     /

 

PL/SQL 过程已成功完成。

4         调用SKIP_CORRUPT_BLOCKS过程,通知oracle忽略所有标记为讹误的数据块。

sys@ORCL>exec dbms_repair.skip_corrupt_blocks('SYSTEM','T2');

 

PL/SQL 过程已成功完成。

 

DBMS_REPARE程序包提供了一种不需要停机就可以使用受损表可用的方法,但是代价是丢失数据。

DBMS_REPARE程序包只应用于表和索引的数据块。

4          使用RMAN恢复讹误块

使用用户托管恢复讹误块的过程:

。将受损的文件脱机

。从发生讹误前生成的备份中还原受损的文件

。完全恢复受损的文件。

。将恢复的文件联机。

使用RMAN备份则可以在不需要停机的情况下进行块级别的还原和恢复。

块介质恢复只适用于数据文件块,不适用于联机日志文件、归档日志文件和控制文件的数据块。

(1)       讹误快的检测

RMAN在执行备份操作时会检测讹误的数据块。

用户托管程序通常只能检测到硬件讹误,而不能检测软件讹误。

默认情况下,RMAN检测到讹误快时,会立即停止备份。

在指定了讹误块容量下,如果讹误没有超过其指定的容量,备份仍会继续,会在存储仓库记录所检测到的讹误地址。

指定讹误块容量命令:

rman>run{

                   set maxcorrupt for datafile 7 to 100;

                            backup datafile 7;}

不检测物理讹误

rman>backup nochecksum datafile 7;

同时检测物理讹误和软件讹误

rman>backup check logical datafile 7;

使用v$database_blcok_corruption查看数据文件的讹误块的详细信息。

v$backup_corruption查看备份集备份的讹误块的详细信息。

V$copy_corruption查看映像副本的讹误块的详细信息。

(2)       块介质恢复

使用块介质恢复器(BLOCK MEDIA RECOVERY,BMR)来执行块介质恢复。

BMR将还原和恢复操作的粒度从数据文件变成为受损的数据块。

BMR的优点:受损的文件不必脱机;恢复操作的平均时间大大减少。

BMR操作可以应用于任何类型的数据块。除了表和索引,LOBUNDO也可以恢复。

(3)       BLOCKRECOVER命令进行块恢复

BLOCKRECOVER命令可以指定需要恢复的数据块。

从文件的最新备份集或映像副本中还原和恢复一个指定的数据块

Blockrecover datafile 7 block5;

恢复若干文件中的一列数据块

Blockrecover datafile 7 block 5,6,7 datafile 9 block 22,26;

从指定的备份集中还原数据块

Blockrecover datafile 7 block 5 from backupset 1096;

使用标记进行指定

Blockrecover datafile 7 block 5 from tag monthly_whole;

使用until选择

Blockrecover corruption list until time sysdate – 7;

BMR中,关键字until并非表示不完全恢复。这个关键字表示必须从特定日期之前生成的备份中还原数据块。

 

5          处理讹误

步骤:

1、  标识确实发生的讹误

2、  标识这些讹误数据块所属的对象

3、  确定要执行的动作

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-730698/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-06-11

  • 博文量
    97
  • 访问量
    180781