一、背景
昨天,有一个同事问我,“为什么恢复日志失败“。
二、问题
为什么使用oracle rman从NBU上恢复日志失败
三、收集数据及分析
3.1 询问
- 询问当前数据库的状态。 回复,成功恢复控制文件和数据文件,现处于mount状态,等待日志恢复。
- 询问调用NBU的接口参数是否正确? 回复正确,并说明曾成功恢复数据文件。
分析: NBU调用接口正常
- 询问存放归档日志路径上是否有冲突文件? 回复没有,并检查确认一个文件也没有。
分析: 不存在冲突
- 询问运行脚本及报错信息。
关键脚本如下:restore archivelog from sequence 100;
报错信息如下:no backup or copy of archivelog sequence 110 found to restore
3.2 检查
- 检查是否有sequence 110的备份。命令如下:
rman target /
list backup of archivelog all;
分析:没有110的备份。
- 进一步检查数据库的日志,命令如下:
sqlplus / as sysdba
archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination +FRA
Oldest online log sequence 111
Next log sequence to archive 110
Current log sequence 110
四、假设及验证
4.1 假设
通过以上的分析,我假设执行归档日志恢复的命令原理有点像事务,要么全部恢复成功,要么全部失败。 这里执行的命令“restore archivelog from sequence 100”是没有指定终止序号,那么就会一直恢复到 最新的日志序号,而在备份仓库里最新的日志序号是没有备份的,所以无法恢复,这时rman就会报错, 最后一个日志文件也不会恢复。
4.2 验证
- 执行以下脚本验证想法:
list backup of archivelog all;
restore archivelog from sequence 100 until sequence 109; # 根据上一命令查出可恢复的最大日志序号,如109
- 成功恢复
- 假设验证成功。
五、结论
执行归档日志恢复的命令原理有点像事务,要么全部恢复成功,要么全部失败。如果在恢复过程中找不到命令指定要恢复的文件,则部分存在的文件也不会恢复。最后显示失败。 所以,我们在执行恢复时,需要确认可恢复的最大的日志序号,并用until显示声明。
六、附录
恢复归档日志,可以有多个方式:
如,按时间恢复
restore archivelog from time "to_date('2016-10-11 10:00:00', 'YYYY-MM-DD HH24:MI:SS')" until time "to_date('2016-10-11 11:00:00', 'YYYY-MM-DD HH24:MI:SS')";
如,按logseq恢复
restore archivelog from logseq=60 until logseq=70;
又如,按sequence恢复
restore archivelog from sequence 60 until sequence 70;
1.备份所有归档日志文件
RMAN> backup archivelog all delete input;
第二: restore archivelog 的各种选项
1.restore archivelog all 恢复全部归档日志文件
RMAN> restore archivelog all;
2.只恢复 5到8这四个归档日志文件
RMAN> restore archivelog from logseq 5 until logseq 8;
3.恢复从第5个归档日志起
RMAN> restore archivelog from logseq 5;
4.恢复7天内的归档日志
RMAN> restore archivelog from time 'sysdate-7';
5. sequence between 写法
RMAN> restore archivelog sequence between 1 and 3;
6.恢复到哪个日志文件为止
RMAN> restore archivelog until logseq 3;
6.从第五个日志开始恢复
RMAN> restore archivelog low logseq 5;
7.到第5个日志为止
RMAN> restore archivelog high logseq 5;
如果想改变恢复到另外路径下 则可用下面语句
set archivelog destination to 'd:\backup';
RMAN> run
2> {allocate channel ci type disk;
3> set archivelog destination to 'd:\backup';
4> restore archivelog all;
5> release channel ci;
6> }
注册目录,归档,备份集:
RMAN>CATALOG ARCHIVELOG '/opt/log/1_60_archivelog.log';
Cataloging multiple copies in a directory
RMAN>CATALOG START WITH '/opt/log';
---ASM:
CATALOG START WITH '+disk'; # catalog allfiles from an ASM disk group
--本地目录:最后一定要加/
CATALOG START WITH '/fs1/datafiles/'; #catalog all files in directory