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操作可以应用于任何类型的数据块。除了表和索引,LOB和UNDO也可以恢复。
(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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9537053/viewspace-730698/