dataguard file header corruption的模拟与修复

本文探讨了数据库中数据块自动修复过程,包括数据块损坏的检测、修复以及文件头损坏的处理方法。通过实例展示了如何在不同级别的数据损坏情况下采取相应的修复策略,确保数据完整性与可用性。
create tablespace test datafile  '/u01/app/oracle/oradata/prod/test.dbf' size 10M autoextend off;
create table test.test_corrupt tablespace test as select * from dba_objects where rownum<10000;

dd if=/dev/zero of=/u01/app/oracle/oradata/prod/test.dbf count=10 seek=131 bs=8192 conv=notrunc

此时自动的数据块修复
看到告警日志为:
Tue Mar 17 12:03:06 2015
Hex dump of (file 6, block 136) in trace file /u01/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_2826.trc
Corrupt block relative dba: 0x01800088 (file 6, block 136)
Completely zero block found during multiblock buffer read
Reading datafile '/u01/app/oracle/oradata/prod/test.dbf' for corruption at rdba: 0x01800088 (file 6, block 136)
Reread (file 6, block 136) found same corrupt data (no logical check)
Starting background process ABMR
Tue Mar 17 12:03:06 2015
Corrupt Block Found
         TSN = 7, TSNAME = TEST
         RFN = 6, BLK = 136, RDBA = 25165960
         OBJN = 88622, OBJD = 88622, OBJECT = TEST_CORRUPT, SUBOBJECT = 
         SEGMENT OWNER = TEST, SEGMENT TYPE = Table Segment
Tue Mar 17 12:03:06 2015
ABMR started with pid=36, OS id=3706 
Automatic block media recovery service is active.
Automatic block media recovery requested for (file# 6, block# 136)
Tue Mar 17 12:03:08 2015
Automatic block media recovery successful for (file# 6, block# 136)
Automatic block media recovery successful for (file# 6, block# 136)


加大破坏力度:(此时会破坏文件头部)
dd if=/dev/zero of=/u01/app/oracle/oradata/prod/test.dbf count=100 seek=0 bs=8192 conv=notrunc

dbv校验下:
dbv file=/u01/app/oracle/oradata/prod/test.dbf blocksize=8192
DBV-00107: Unknown header format (0) (0)文件头损坏了。

文件头损坏:
[oracle@cell01 prod]$ dbfsize /u01/app/oracle/oradata/prod/testbk.dbf
/u01/app/oracle/oradata/prod/testbk.dbf: Header block magic number is bad

此时主库无法看到表:
SQL> select count(*) from test.test_corrupt;
select count(*) from test.test_corrupt
                         *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 131)
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'

主库告警日志发现,文件头损坏是不能恢复的
Tue Mar 17 12:07:59 2015
Dumping diagnostic data in directory=[cdmp_20150317120759], requested by (instance=1, osid=2826), summary=[incident=12153].
Automatic block media recovery requested for (file# 6, block# 131)
Automatic block media recovery failed for (file# 6, block# 131)
        [request flood controlled]
Errors in file /u01/app/oracle/diag/rdbms/prod/prod/trace/prod_ora_2826.trc  (incident=12154):
ORA-01578: ORACLE data block corrupted (file # 6, block # 131)
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'
Incident details in: /u01/app/oracle/diag/rdbms/prod/prod/incident/incdir_12154/prod_ora_2826_i12154.trc
Hex dump of (file 6, block 1) in trace file /u01/app/oracle/diag/rdbms/prod/prod/incident/incdir_12154/prod_ora_2826_i12154.trc
Corrupt block relative dba: 0x00000001 (file 6, block 1)
Completely zero block found during validating datafile for block range
Reread of blocknum=1, file=/u01/app/oracle/oradata/prod/test.dbf. found same corrupt data
Reread of blocknum=1, file=/u01/app/oracle/oradata/prod/test.dbf. found same corrupt data
Reread of blocknum=1, file=/u01/app/oracle/oradata/prod/test.dbf. found same corrupt data
Reread of blocknum=1, file=/u01/app/oracle/oradata/prod/test.dbf. found same corrupt data
Reread of blocknum=1, file=/u01/app/oracle/oradata/prod/test.dbf. found same corrupt data
Errors in file /u01/app/oracle/diag/rdbms/prod/prod/incident/incdir_12154/prod_ora_2826_i12154.trc:
ORA-19563: datafile header validation failed for file /u01/app/oracle/oradata/prod/test.dbf
ORA-01251: Unknown File Header Version read for file number 6
ORA-01578: ORACLE data block corrupted (file # 6, block # 131)
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'
Tue Mar 17 12:08:00 2015
Sweep [inc][12153]: completed
Sweep [inc2][12153]: completed
Dumping diagnostic data in directory=[cdmp_20150317120801], requested by (instance=1, osid=2826), summary=[incident=12154].

尝试手工修复吧,把好的文件从备库拿过来。(这种方法不可行)
备库执行:
SQL> select count(*) from test.test_corrupt;
  COUNT(*)
----------
      9999
recover managed standby database cancel;
copy file to primary db;

此时主库报错:
Tue Mar 17 12:12:39 2015
Read of datafile '/u01/app/oracle/oradata/prod/test.dbf' (fno 6) header failed with ORA-01208
Rereading datafile 6 header failed with ORA-01208
Errors in file /u01/app/oracle/diag/rdbms/prod/prod/incident/incdir_12155/prod_m002_3959_i12155_a.trc:
ORA-19583: conversation terminated due to error
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'
ORA-01208: data file is an old version - not accessing current version ---不是当前的版本,
Tue Mar 17 12:12:52 2015
Corrupt Block Found
         TSN = 7, TSNAME = TEST
         RFN = 6, BLK = 133, RDBA = 25165957
         OBJN = 88622, OBJD = 88622, OBJECT = TEST_CORRUPT, SUBOBJECT = 
         SEGMENT OWNER = TEST, SEGMENT TYPE = Table Segment

怎么办?
SQL> select count(*) from test.test_corrupt;
select count(*) from test.test_corrupt
                          *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 131)
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'
SQL> recover datafile 6;
ORA-00283: recovery session canceled due to errors
ORA-01124: cannot recover data file 6 - file is in use or recovery
ORA-01110: data file 6: '/u01/app/oracle/oradata/prod/test.dbf'

这种方法不可用,参考文档#
best Practices for Corruption Detection, Prevention, and Automatic Repair - in a Data Guard Configuration (文档 ID 1302539.1)
那么只有手工方式来修复file header了。
还是百度快,参考文档
http://blog.youkuaiyun.com/daimin1983/article/details/3225892
修正方法如下:
SQL> alter database create datafile '/u01/app/oracle/oradata/prod/test.dbf';
Database altered.

SQL> recover datafile 6;
ORA-00279: change 1081814 generated at 03/17/2015 11:44:17 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/oradata/prod_log/1_32_874356072.dbf
ORA-00280: change 1081814 for thread 1 is in sequence #32
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
SQL> alter database datafile 6 online;
Database altered.
SQL> select count(*) from test.test_corrupt;
  COUNT(*)
----------
      9999


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

转载于:http://blog.itpub.net/89196/viewspace-1463609/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值