无RMAN备份集情况下的坏块恢复(五)

2015-01-21 12:22:22 · 作者: · 浏览: 27
5, Oracle.? All rights reserved.



SQL> conn zlm/zlm
Connected.
SQL> select * from corrupt_test;



? ? ? ? ID NAME
---------- ---------------
? ? ? ? 1 aaron8219



此时由于测试表corrupt_test里数据块中的行数据还在内存中,所以还是可以查询到行记录的



SQL> alter system flush buffer_cache;



System altered.



SQL> select * from corrupt_test;
select * from corrupt_test
? ? ? ? ? ? ? *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 12)
ORA-01110: data file 6: '/u01/app/oracle/oradata/ora10g/zlm01.dbf'



但是一旦我们把它刷到磁盘,就报ORA-01578的错误了,提示6号文件的第12个块损坏了,就是之前指定的那个数据块



SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@ora10g backupsets]$ rman target /



Recovery Manager: Release 10.2.0.1.0 - Production on 16 16:30:19 2014



Copyright (c) 1982, 2005, Oracle.? All rights reserved.



connected to target database: ORA10G (DBID=4175411955)



RMAN> blockrecover datafile 6 block 12;



Starting blockrecover at 2014-11-26
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=159 devtype=DISK



RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of blockrecover command at 11/26/2014 16:30:51
RMAN-06026: some targets not found - aborting restore
RMAN-06023: no backup or copy of datafile 6 found to restore



此时直接用blockrecover来恢复坏块是不行的,首先我们没有可用的备份集,其次,控制文件中也不知道从哪里去找可用的备份文件,那么我们就要先把之前做过的热备文件catalog到控制文件中



RMAN> catalog datafilecopy '/u01/zlm01_bak.dbf';



cataloged datafile copy
datafile copy filename=/u01/zlm01_bak.dbf recid=17 stamp=864664486



RMAN> blockrecover datafile 6 block 12;



Starting blockrecover at 2014-11-26
using channel ORA_DISK_1



channel ORA_DISK_1: restoring block(s) from datafile copy /u01/zlm01_bak.dbf



starting media recovery
media recovery complete, elapsed time: 00:00:01



Finished blockrecover at 2014-11-26



RMAN> exit


Recovery Manager complete.



再做一次blockrecover,现在就顺利地介质恢复完了



[oracle@ora10g backupsets]$ sqlplus zlm/zlm



SQL*Plus: Release 10.2.0.1.0 - Production on 16 16:35:23 2014



Copyright (c) 1982, 2005, Oracle.? All rights reserved.


?



Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options



SQL> select * from corrupt_test;



? ? ? ? ID NAME
---------- ---------------
? ? ? ? 1 aaron8219



SQL>


可以看到,之前丢失的数据,又回来了


总结:


虽然在没有RMAN备份集的情况下,通过热备文件可以把丢失的数据恢复出来,但这毕竟还是很不靠谱的。在生产环境中,我们几乎不可能经常去对某个数据文件做热备,也不会知道什么时候,哪个文件就会出现坏块。所以,平时做好RMAN全备还是非常非常重要的,只要有备份集和归档,我们的数据就不会丢失。当执行blockrecover datafile xxx block xxx时,Oracle会直接去RMAN备份集中恢复,不需要额外的catalog步骤,也不用我们过多地人为干预。


--------------------------------------推荐阅读 --------------------------------------


--------------------------------------分割线 --------------------------------------