如何获取Oracle中含指定SCN(含RAC场景Smax)的归档重做日志文件名?
我来一步步帮你解决这两个Oracle归档日志相关的问题:
问题1:如何获取Oracle中包含指定SCN的归档重做日志文件名?
你可以直接查询Oracle的v$archived_log视图(RAC环境用gv$archived_log),这个视图记录了所有归档日志的关键信息,包括每个归档覆盖的SCN区间。
执行下面的SQL语句,把&target_scn替换成你要找的目标SCN即可:
SELECT name FROM v$archived_log WHERE &target_scn BETWEEN first_change# AND next_change#;
补充说明:
first_change#是该归档日志包含的第一个SCN,next_change#是下一个归档日志的起始SCN,所以目标SCN落在这个区间内,就说明这个归档包含你要找的SCN。- 如果是RAC环境,你可以加上
inst_id过滤特定节点,或者直接查全局视图gv$archived_log,同时返回节点ID:
SELECT inst_id, name FROM gv$archived_log WHERE &target_scn BETWEEN first_change# AND next_change#;
问题2:RAC环境下定位包含Smax的归档并让备库应用后停止
完全可以实现,咱们分步骤来:
步骤1:确定哪个节点的SCN是Smax
先查询所有节点的当前SCN,找到最大值对应的节点:
SELECT inst_id, current_scn FROM gv$database ORDER BY current_scn DESC;
结果里第一行的inst_id就是Smax所在的节点,current_scn就是你要的Smax。
步骤2:找到包含Smax的归档日志文件名
用全局视图跨节点查询,直接定位目标归档:
SELECT inst_id, thread#, name, sequence# FROM gv$archived_log WHERE &smax_scn BETWEEN first_change# AND next_change#;
这里返回的thread#是节点对应的线程号,sequence#是归档序列号,后面备库恢复会用到。
步骤3:让备库应用完该归档后停止
有两种常用方式,根据你的备库配置选择:
方式1:用SQL*Plus执行
如果备库是管理恢复模式,先停止实时应用(如果开启的话),然后执行:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE UNTIL SCN &smax_scn;
这条命令会让备库应用所有包含SCN≤Smax的归档,完成后自动停止恢复。
方式2:用RMAN执行
如果用RMAN管理恢复,执行:
RUN { RECOVER STANDBY DATABASE UNTIL SCN &smax_scn; }
注意事项:
- 执行恢复前,要确保包含Smax的归档日志已经成功传输到备库,可以在备库查询
v$archived_log或gv$archived_log确认该归档存在且状态为AVAILABLE。 - 如果备库开启了实时应用,执行上述命令后,实时应用会自动停止,后续如果需要恢复实时应用,再执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;即可。
内容的提问来源于stack exchange,提问作者AVA
相关产品推荐
相关产品推荐

