暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用RMAN进行基于数据块的恢复

原创 eygle 2019-11-28
725

从Oracle 9i开始,RMAN开始支持基于数据块的恢复,当表空间中的某个数据块发生损坏,恢复整个文件显得有点过于昂贵,而数据块的恢复则可以帮助我们快速恢复,减少业务影响。基于数据块的恢复可以在线进行,甚至受损数据文件也不受影响,只是在恢复完成之前访问损坏Block会收到错误提示;基于Block的恢复必须是完全恢复,所以完整的备份必不可少。

来看以下测试,首先对测试数据库执行一个全备份:

D:\>rman target /

恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.

连接到目标数据库: EYGLE (DBID=1365961916)
RMAN> backup database format='d:\oradata\eygle_fullbk.bak' tag='eygle';

启动 backup 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=D:\ORADATA\EYGLE\SYSTEM01.DBF
输入数据文件 fno=00005 name=D:\ORADATA\EYGLE\UNDOTBS2.DBF
输入数据文件 fno=00002 name=D:\ORADATA\EYGLE\EYGLE01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 12-6月 -05
通道 ORA_DISK_1: 已完成段 1 于 12-6月 -05
段 handle=D:\ORADATA\EYGLE_FULLBK.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:27
完成 backup 于 12-6月 -05

为了测试的需要,可以使用UltraEdit或者WinHex打开文件修改某个数据块,然后保存,模拟数据块损坏,也可以使用Oracle的内部工具BBED损坏一个数据块,用于测试,损坏的数据块在访问时会出现错误:

09:06:33 SQL> select count(*)from t;
select count(*)from t
                    *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号2,块号14)
ORA-01110: 数据文件 2: 'D:\ORADATA\EYGLE\EYGLE01.DBF'

通过dbv工具及警告日志文件都可以发现损坏错误:

***
Corrupt block relative dba: 0x0080000e (file 2, block 14)
Bad check value found during buffer read
Data in bad block -
 type: 6 format: 2 rdba: 0x0080000e
 last change scn: 0x0000.00078584 seq: 0x1 flg: 0x06
 consistency value in tail: 0x85840601
 check value in block header: 0xca4b, computed block checksum: 0x5a6
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0080000e (file 2, block 14) found same corrupted data

RMAN的一个功能是在备份过程中可以发现损坏的数据块,也可以使用RMAN验证数据文件,以发现坏块:

RMAN> backup validate datafile 2;

启动 backup 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=D:\ORADATA\EYGLE\EYGLE01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 12-6月 -05

验证完成之后,警告日志及数据库中都会记录损坏的数据块信息,从数据库中查询一下:

09:08:25 SQL> select * from v$database_block_corruption where file#=2;
     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         2         14          1                  0 FRACTURED

现在可以通过备份来进行基于数据块级别的恢复:

RMAN> blockrecover datafile 2 block 14 from backupset;

启动 blockrecover 于 12-6月 -05
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=11 devtype=DISK

通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00002 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=D:\ORADATA\EYGLE_FULLBK.BAK tag=EYGLE params=NULL
通道 ORA_DISK_1: 块恢复已完成

正在开始介质的恢复
完成介质的恢复

完成 blockrecover 于 12-6月 -05 

完成恢复之后,可以登录数据库查询:

09:11:08 SQL> select * from v$database_block_corruption where file#=2;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         2         14          1                  0 FRACTURED
09:11:12 SQL> select count(*) from t;
  COUNT(*)
----------
       896

此时数据已经恢复,但是block corruption信息仍然记录在数据库中,直到下次validate才会清除这部分信息:

D:\>rman target /

恢复管理器: 版本9.2.0.6.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
连接到目标数据库: EYGLE (DBID=1365961916)

RMAN> backup validate datafile 2;
启动 backup 于 12-6月 -05

正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=9 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00002 name=D:\ORADATA\EYGLE\EYGLE01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 12-6月 -05 

此时从数据库中查询,坏块信息被清除。

09:11:22 SQL> select * from v$database_block_corruption where file#=2;
未选定行
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论