您好,欢迎访问一九零五行业门户网

基于RMAN实现坏块介质恢复(blockrecover)

对于物理损坏的数据块,我们可以通过rman块介质恢复(block media recovery)功能来完成受损块的恢复,而不需要恢复整个数据库或所
对于物理损坏的数据块,,我们可以通过rman块介质恢复(block media recovery)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据块。恢复整个数据库或数据文件那不是大炮用来打蚊子,有点不值得!但前提条件是你得有一个可用的rman备份存在,因此,无论何时备份就是一切。本文演示了产生坏块即使用rman实现坏块恢复的全过程。
相关阅读:
使用rman的duplicate功能创建物理dataguard
oracle基础教程之通过rman复制数据库
rman备份策略制定参考内容
rman备份学习笔记
oracle数据库备份加密 rman加密
1、创建演示环境
sql> select * from v$version where rownum
banner
--------------------------------------------------------------------------------
oracle database 11g enterprise edition release 11.2.0.1.0 - production
--创建用于演示的data file
sql> create tablespace tbs_tmp datafile '/u02/database/usbo/oradata/tbs_tmp.dbf' size 10m autoextend on;
sql> conn scott/tiger;
--基于新的数据文件创建对象tb_tmp
sql> create table tb_tmp tablespace tbs_tmp as select * from dba_objects;
sql> col file_name format a60
sql> select file_id,file_name from dba_data_files where tablespace_name='tbs_tmp';
  file_id file_name
---------- ------------------------------------------------------------
        6 /u02/database/usbo/oradata/tbs_tmp.dbf
--表对象tb_tmp上的信息,包含对应的文件信息,头部块,总块数
sql> select segment_name , header_file , header_block,blocks     
  2  from dba_segments
  3  where segment_name = 'tb_tmp' and owner='scott';
segment_name                  header_file header_block    blocks
------------------------------ ----------- ------------ ----------
tb_tmp                                  6          130      1152
--首先使用rman备份对应的数据文件
$ $oracle_home/bin/rman target /
rman> backup datafile 6 tag=health;
starting backup at 2013/08/28 17:03:15
allocated channel: ora_disk_1
channel ora_disk_1: sid=24 device type=disk
channel ora_disk_1: starting full datafile backup set
channel ora_disk_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/u02/database/usbo/oradata/tbs_tmp.dbf
channel ora_disk_1: starting piece 1 at 2013/08/28 17:03:16
channel ora_disk_1: finished piece 1 at 2013/08/28 17:03:17
piece handle=/u02/database/usbo/fr_area/usbo/backupset/2013_08_28/o1_mf_nnndf_health_91vh6ntb_.bkp tag=health comment=none
channel ora_disk_1: backup set complete, elapsed time: 00:00:01
finished backup at 2013/08/28 17:03:17
rman> exit
2、单块数据块损坏的恢复处理
--下面使用了linux自带的dd命令来损坏单块数据块
[oracle@linux1 ~]$ dd of=/u02/database/usbo/oradata/tbs_tmp.dbf bs=8192 conv=notrunc seek=130 > corrupted block!
> eof
0+1 records in
0+1 records out
17 bytes (17 b) copied, 0.000184519 seconds, 92.1 kb/s
--清空buffer cache
sql> alter system flush buffer_cache;
--查询表对相 tb_tmp,收到ora-01578
sql> select count(*) from tb_tmp;
select count(*) from tb_tmp
*
error at line 1:
ora-01578: oracle data block corrupted (file # 6, block # 130)
ora-01110: data file 6: '/u02/database/usbo/oradata/tbs_tmp.dbf'
--查询视图v$database_block_corruption,提示有坏块,注意该视图可能不会返回任何数据,如无返回,先执行backup validate
sql> select * from v$database_block_corruption;
    file#    block#    blocks corruption_change# corruptio
---------- ---------- ---------- ------------------ ---------
        6        129          1                  0 corrupt
--也可以使用dbv工具来校验坏块,参考:  
--下面使用blockrecover来恢复坏块     
rman> blockrecover datafile 6 block 130;
starting recover at 2013/08/28 17:22:25
using target database control file instead of recovery catalog
allocated channel: ora_disk_1
channel ora_disk_1: sid=24 device type=disk
channel ora_disk_1: restoring block(s)
channel ora_disk_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00006
channel ora_disk_1: reading from backup piece /u02/database/usbo/fr_area/usbo/backupset/2013_08_28/o1_mf_nnndf_health_91vh6ntb_.bkp
channel ora_disk_1: piece handle=/u02/database/usbo/fr_area/usbo/backupset/2013_08_28/o1_mf_nnndf_health_91vh6ntb_.bkp tag=health
channel ora_disk_1: restored block(s) from backup piece 1
channel ora_disk_1: block restore complete, elapsed time: 00:00:01
starting media recovery
media recovery complete, elapsed time: 00:00:03
finished recover at 2013/08/28 17:22:31
--再次查询表tb_emp正常
sql> select count(*) from tb_tmp;
  count(*)
----------
    72449
其它类似信息

推荐信息