因此,除了归档322外,从323到325都与BLOCK 27的修改无关。根据Oracle的文档,这些归档的缺失将不会影响BLOCK 27的恢复。
为了验证文档的说法,下面将归档322到326修改名称,使得Oracle在恢复时无法找到归档日志。
最后执行的几次ALTER SYSTEM SWITCH LOGFILE操作,是确保SEQUENCE为326的联机重做日志已经被重用,避免Oracle利用联机重做日志来代替归档日志。
准备工作完毕,下面开始模拟坏块。仍然是通过UtralEdit对数据文件进行修改,先是定位数据块的偏移地址:
SQL> SHOW PARAMETER BLOCK_SIZE
NAME TYPE VALUE
------------------------------------ ----------- --------------------------
db_block_size integer 8192
SQL> SELECT TO_CHAR(8192 * 27, 'XXXXX') FROM DUAL;
TO_CHA
------
36000
下面对地址36000后面的数据进行修改,并保存。
执行SQL语句,可以看到下面的错误:
SQL> SELECT COUNT(*) FROM TEST;
SELECT COUNT(*) FROM TEST
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号5,块号27)
ORA-01110: 数据文件 5: 'F:ORACLEORADATATEST1TOOLS01.DBF'
下面可以对损坏的数据块进行BLOCKRECOVER,注意这时归档322到326已经被修改名称。
RMAN> blockrecover datafile 5 block 27;
启动 blockrecover 于 17-6月 -07
正在使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00005 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1 tag=TAG20070617T020728 params=NULL
通道 ORA_DISK_1: 块恢复已完成
正在开始介质的恢复
存档日志线程 1 序列 327 已作为文件 F:ORACLEORADATATEST1ARCHIVELOGARC00327.001 存在于磁盘上
存档日志线程 1 序列 328 已作为文件 F:ORACLEORADATATEST1ARCHIVELOGARC00328.001 存在于磁盘上
存档日志线程 1 序列 329 已作为文件 F:ORACLEORADATATEST1ARCHIVELOGARC00329.001 存在于磁盘上
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of blockrecover command at 06/17/2007 02:33:18
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of log thread 1 seq 326 scn 58749837 found to restore
RMAN-06025: no backup of log thread 1 seq 325 scn 58749812 found to restore
RMAN-06025: no backup of log thread 1 seq 324 scn 58749793 found to restore
www.ixdba.net
RMAN-06025: no backup of log thread 1 seq 323 scn 58749778 found to restore
RMAN-06025: no backup of log thread 1 seq 322 scn 58749749 found to restore
这个错误的出现是正常的,由于归档322中包含了对BLOCK 27的修改,下面恢复归档322的原始名称,再次执行恢复:
RMAN> blockrecover datafile 5 block 27;
启动 blockrecover 于 17-6月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00005 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1 tag=TAG20070617T020728 params=NULL
通道 ORA_DISK_1: 块恢复已完成
正在开始介质的恢复
存档日志线程 1 序列 327 已作为文件 F:ORACLEORADATATEST1ARCHIVELOGARC00327.001 存在于磁盘上
存档日志线程 1 序列 328 已作为文件 F:ORACLEORADATATEST1ARCHIVELOGARC00328.001 存在于磁盘上