使用blockrecover 对有坏块的数据文件进行恢复
1.创建测试表
SQL> create tablespace tb1 datafile 'E:\oracle\product\10.2.0\oradata\orcl\tb101.dbf' size 5m;
表空间已创建。
SQL> create table tb1 tablespace tb1 as select * from t_t1;
表已创建。
SQL> select count(*)from tb1;
COUNT(*)
----------
40741
2.rman全库备份
RMAN> backup as compressed backupset database format 'C:\oracle\%U';
启动 backup 于 13-12月-14
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动压缩的全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
输入数据文件 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
输入数据文件 fno=00005 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF
输入数据文件 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00007 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST_UNIFORM01.DBF
输入数据文件 fno=00008 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF
输入数据文件 fno=00009 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB01.DBF
输入数据文件 fno=00011 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF
输入数据文件 fno=00010 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MY_UNDO01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 13-12月-14
通道 ORA_DISK_1: 已完成段 1 于 13-12月-14
段句柄=C:\ORACLE\06PQ2J9L_1_1 标记=TAG20141213T133756 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:55
通道 ORA_DISK_1: 启动压缩的全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 13-12月-14
通道 ORA_DISK_1: 已完成段 1 于 13-12月-14
段句柄=C:\ORACLE\07PQ2JBC_1_1 标记=TAG20141213T133756 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 13-12月-14
3.关闭数据库,模拟数据块损坏
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
用flexhex损坏数据文件
4.打开数据库
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 104858980 bytes
Database Buffers 58720256 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
数据库正常能打开,查询时出现块损坏
SQL> select count(*)from tb1;
select count(*)from tb1
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 11, 块号 71)
ORA-01110: 数据文件 11: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF'
5.使用dbv对数据文件做检测
E:\oracle\product\10.2.0\oradata\orcl>dbv file=tb101.dbf blocksize=8192
DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 12月 13 14:12:41 2014
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBVERIFY - 开始验证: FILE = tb101.dbf
页 71 标记为损坏
Corrupt block relative dba: 0x02c00047 (file 11, block 71)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x02c00047
last change scn: 0x0000.00178a9c seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x8a9c0601
check value in block header: 0x921
computed block checksum: 0x59
DBVERIFY - 验证完成
检查的页总数: 640
处理的页总数 (数据): 62
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 15
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 562
标记为损坏的总页数: 1
流入的页总数: 0
最高块 SCN : 1542814 (0.1542814)
有1个块损坏,71
6.对数据库中的坏块进行验证
SQL> select * from v$database_block_corruption;
未选定行
RMAN> backup validate database;
启动 backup 于 13-12月-14
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=142 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
输入数据文件 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
输入数据文件 fno=00005 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF
输入数据文件 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00007 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST_UNIFORM01.DBF
输入数据文件 fno=00008 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS02.DBF
输入数据文件 fno=00009 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB01.DBF
输入数据文件 fno=00011 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TB101.DBF
输入数据文件 fno=00010 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\MY_UNDO01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:35
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 13-12月-14
刚才那些坏块都被列入到了视图V$DATABASE_BLOCK_CORRUPTION中。
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
11 71 1 0 CHECKSUM
7.使用blockrecover恢复
RMAN> blockrecover datafile 11 block 71;
启动 blockrecover 于 13-12月-14
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00011 的块
通道 ORA_DISK_1: 正在读取备份段 C:\ORACLE\06PQ2J9L_1_1
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = C:\ORACLE\06PQ2J9L_1_1 标记 = TAG20141213T133756
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:04
正在开始介质的恢复
介质恢复完成, 用时: 00:00:07
完成 blockrecover 于 13-12月-14
还可以通过RMAN> blockrecover corruption list进行块的恢复,这是在大量块损坏时或全部块损坏时使用,
前提是先执行RMAN>backup validate database,在V$DATABASE_BLOCK_CORRUPTION里有对应的坏块的列表。
8.恢复完成后,进行验证
E:\oracle\product\10.2.0\oradata\orcl>dbv file=tb101.dbf blocksize=8192
DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 12月 13 14:23:05 2014
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBVERIFY - 开始验证: FILE = tb101.dbf
DBVERIFY - 验证完成
检查的页总数: 640
处理的页总数 (数据): 63
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 15
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 562
标记为损坏的总页数: 0
流入的页总数: 0
最高块 SCN : 1542814 (0.1542814)
没有显示坏块
SQL> select count(*)from tb1;
COUNT(*)
----------
40741
恢复成功