日期:2014-05-16 浏览次数:20436 次
对于物理损坏的数据块,我们可以通过RMAN块介质恢复(BLOCK MEDIA RECOVERY)功能来完成受损块的恢复,而不需要恢复整个数据库或所有文件来修复这些少量受损的数据块。恢复整个数据库或数据文件那不是大炮用来打蚊子,有点不值得!但前提条件是你得有一个可用的RMAN备份存在,因此,无论何时备份就是一切。本文演示了产生坏块即使用RMAN实现坏块恢复的全过程。
1、创建演示环境
SQL> select * from v$version where rownum<2; 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 <<EOF > 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工具来校验坏块,参考: http://blog.csdn.net/robinson_0612/article/details/6530890 --下面使用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