RMAN备份恢复之归档日志对BLOCKRECOVER的影响
上面一篇简单的介绍了一下RMAN的BLOCKRECOVER的用法,这篇打算介绍一下缺失归档日志对BLOCKRECOVER的影响。
为了演示归档对BLOCKRECOVER的影响,先构造一个例子:
RMAN>backuptablespacetools;
启动backup于16-6月-07
使用通道ORA_DISK_1
通道ORA_DISK_1:正在启动full数据文件备份集
通道ORA_DISK_1:正在指定备份集中的数据文件
输入数据文件fno=00005name=F:ORACLEORADATATEST1TOOLS01.DBF
通道ORA_DISK_1:正在启动段1于16-6月-07
通道ORA_DISK_1:已完成段1于16-6月-07
段handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1comment=NONE
通道ORA_DISK_1:备份集已完成,经过时间:00:00:03
完成backup于16-6月-07
首先备份一下表空间,这个表空间的备份用来作为BLOCKRECOVER的全备份基础。
SQL>CREATETABLETESTTABLESPACETOOLSASSELECTROWNUMID,A.*FROMDBA_OBJECTSA;
表已创建。
SQL>SELECTCOUNT(*)FROMTEST;
COUNT(*)
----------
28036
SQL>SELECTROWIDFROMTESTWHEREID=1000;
ROWID
------------------
AAAHApAAFAAAAAbAA8
SQL>SELECTIDFROMTEST
2WHEREROWID>='AAAHApAAFAAAAAbAAA'
3ANDROWID<'AAAHApAAFAAAAAcAAA';
ID
----------
940
941
942
943
944
945
946
947
.
.
.
1004
1005
1006
已选择67行。
SQL>SELECTDISTINCTDBMS_ROWID.ROWID_RELATIVE_FNO(ROWID),
2DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
3FROMTEST
4WHEREID>=940
5ANDID<=1006;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------------------------------------------
527
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>SELECTMAX(SEQUENCE#)FROMV$ARCHIVED_LOG;
MAX(SEQUENCE#)
--------------
321
SQL>UPDATETESTSETOBJECT_NAME=LOWER(OBJECT_NAME)WHEREID=1000;
已更新1行。
SQL>COMMIT;
提交完成。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>DELETETESTWHEREID=1;
已删除1行。
SQL>COMMIT;
提交完成。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>UPDATETESTSETOBJECT_TYPE='TEST'WHEREID=10000;
已更新1行。
SQL>COMMIT;
提交完成。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>CREATETABLETEST2(IDNUMBER);
表已创建。
SQL>INSERTINTOTEST2VALUES(1);
已创建1行。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>ALTERSYSTEMSWITCHLOGFILE;
系统已更改。
SQL>SELECTNAMEFROMV$ARCHIVED_LOGWHERESEQUENCE#>321;
NAME
------------------------------------------------------------
F:ORACLEORADATATEST1ARCHIVELOGARC00322.001
F:ORACLEORADATATEST1ARCHIVELOGARC00323.001
F:ORACLEORADATATEST1ARCHIVELOGARC00324.001
F:ORACLEORADATATEST1ARCHIVELOGARC00325.001
F:ORACLEORADATATEST1ARCHIVELOGARC00326.001
F:ORACLEORADATATEST1ARCHIVELOGARC00327.001
F:ORACLEORADATATEST1ARCHIVELOGARC00328.001
已选择7行。
SQL>SELECTSEQUENCE#FROMV$LOG;
SEQUENCE#
----------
328
329
327
首先建立一张测试表,在这个表中,ID在940和1006之间的记录存储在DATAFILE5BLOCK27中。在归档322中记录了TEST表的ID等于1000的记录的更新,这个更新发生在DATAFILE5BLOCK27上。随后在归档323中,删除了ID等于1的记录,这条记录与BLOCK27无关。在归档324中,更新了ID等于10000的记录,这个修改与BLOCK27也无关。在归档325中,新建TEST2表,并插入数据。归档326就是一个空文件。
因此,除了归档322外,从323到325都与BLOCK27的修改无关。根据Oracle的文档,这些归档的缺失将不会影响BLOCK27的恢复。
为了验证文档的说法,下面将归档322到326修改名称,使得Oracle在恢复时无法找到归档日志。
最后执行的几次ALTERSYSTEMSWITCHLOGFILE操作,是确保SEQUENCE为326的联机重做日志已经被重用,避免Oracle利用联机重做日志来代替归档日志。
准备工作完毕,下面开始模拟坏块。仍然是通过UtralEdit对数据文件进行修改,先是定位数据块的偏移地址:
SQL>SHOWPARAMETERBLOCK_SIZE
NAMETYPEVALUE
-------------------------------------------------------------------------
db_block_sizeinteger8192
SQL>SELECTTO_CHAR(8192*27,'XXXXX')FROMDUAL;
TO_CHA
------
36000
下面对地址36000后面的数据进行修改,并保存。
执行SQL语句,可以看到下面的错误:
SQL>SELECTCOUNT(*)FROMTEST;
SELECTCOUNT(*)FROMTEST
*
ERROR位于第1行:
ORA-01578:ORACLE数据块损坏(文件号5,块号27)
ORA-01110:数据文件5:'F:ORACLEORADATATEST1TOOLS01.DBF'
下面可以对损坏的数据块进行BLOCKRECOVER,注意这时归档322到326已经被修改名称。
RMAN>blockrecoverdatafile5block27;
启动blockrecover于17-6月-07
正在使用目标数据库控制文件替代恢复目录
分配的通道:ORA_DISK_1
通道ORA_DISK_1:sid=14devtype=DISK
通道ORA_DISK_1:正在恢复块
通道ORA_DISK_1:正在指定要从备份集恢复的块
正在恢复数据文件00005的块
通道ORA_DISK_1:已从备份段1恢复块
段handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1tag=TAG20070617T020728params=NULL
通道ORA_DISK_1:块恢复已完成
正在开始介质的恢复
存档日志线程1序列327已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00327.001存在于磁盘上
存档日志线程1序列328已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00328.001存在于磁盘上
存档日志线程1序列329已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00329.001存在于磁盘上
RMAN-00571:===========================================================
RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002:failureofblockrecovercommandat06/17/200702:33:18
RMAN-06053:unabletoperformmediarecoverybecauseofmissinglog
RMAN-06025:nobackupoflogthread1seq326scn58749837foundtorestore
RMAN-06025:nobackupoflogthread1seq325scn58749812foundtorestore
RMAN-06025:nobackupoflogthread1seq324scn58749793foundtorestore
RMAN-06025:nobackupoflogthread1seq323scn58749778foundtorestore
RMAN-06025:nobackupoflogthread1seq322scn58749749foundtorestore
这个错误的出现是正常的,由于归档322中包含了对BLOCK27的修改,下面恢复归档322的原始名称,再次执行恢复:
RMAN>blockrecoverdatafile5block27;
启动blockrecover于17-6月-07
使用通道ORA_DISK_1
通道ORA_DISK_1:正在恢复块
通道ORA_DISK_1:正在指定要从备份集恢复的块
正在恢复数据文件00005的块
通道ORA_DISK_1:已从备份段1恢复块
段handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1tag=TAG20070617T020728params=NULL
通道ORA_DISK_1:块恢复已完成
正在开始介质的恢复
存档日志线程1序列327已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00327.001存在于磁盘上
存档日志线程1序列328已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00328.001存在于磁盘上
存档日志线程1序列329已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00329.001存在于磁盘上
RMAN-00571:===========================================================
RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002:failureofblockrecovercommandat06/17/200702:36:18
RMAN-06053:unabletoperformmediarecoverybecauseofmissinglog
RMAN-06025:nobackupoflogthread1seq326scn58749837foundtorestore
RMAN-06025:nobackupoflogthread1seq325scn58749812foundtorestore
RMAN-06025:nobackupoflogthread1seq324scn58749793foundtorestore
RMAN-06025:nobackupoflogthread1seq323scn58749778foundtorestore
仍然报错,这说明文档上描述的BLOCKRECOVER可以跨越无关的日志的说法是有问题的。
下面依次恢复323、324的名称并测试发现仍然存在上面的问题。
最后恢复325的名称,目前仅归档326不可见,而这个归档是一个空归档,看看BLOCKRECOVER是否可以跳过空归档进行恢复。
RMAN>blockrecoverdatafile5block27;
启动blockrecover于17-6月-07
使用通道ORA_DISK_1
通道ORA_DISK_1:正在恢复块
通道ORA_DISK_1:正在指定要从备份集恢复的块
正在恢复数据文件00005的块
通道ORA_DISK_1:已从备份段1恢复块
段handle=F:ORACLEORACLE920DATABASEHIKFE30_1_1tag=TAG20070617T020728param
s=NULL
通道ORA_DISK_1:块恢复已完成
正在开始介质的恢复
存档日志线程1序列327已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00327.001存在于磁盘上
存档日志线程1序列328已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00328.001存在于磁盘上
存档日志线程1序列329已作为文件F:ORACLEORADATATEST1ARCHIVELOGARC00329.001存在于磁盘上
RMAN-00571:===========================================================
RMAN-00569:===============ERRORMESSAGESTACKFOLLOWS===============
RMAN-00571:===========================================================
RMAN-03002:failureofblockrecovercommandat06/17/200702:41:16
RMAN-06053:unabletoperformmediarecoverybecauseofmissinglog
RMAN-06025:nobackupoflogthread1seq326scn58749837foundtorestore
错误依旧,RMAN连一个空的归档都无法跳过,看来这块的文档描述和实际情况有很大的出入。
从这一点也反映出归档日志的重要性,如果丢失了归档日志,不管是常规恢复还是数据库的恢复都是无法进行的。