场景1:
使用rman备份恢复的方式创建dataguard,归档的自动备份任务被注释(即使不被注释,pr归档备份后由于log_archive_dest_2非空,无法自动删除),由于备份恢复或者传输备份的时间过久,导致pr的归档目录积压,为了不影响pr业务,需要清理pr归档(log_archive_dest_2置空再跑归档备份)
场景2:
由于dr归档目录设置不合理或者没有部署dr的归档删除脚本,或者dr同步异常停止,或者其他测试要求需要临时停止dr的同步,导致pr这边归档积压(与dr相差50个归档以上),且两战点的同步链路与业务使用同一网络,恢复dr同步之前,需要将pr的归档备份,然后限制scp传输速率将归档备份集传到dr恢复
解决方法:
针对场景1和2,我们的处理方式相似
(1)查询当前dr的同步进度(场景1忽略此步骤)
pr端查询两个站点的归档gap:
select a.thread#,(log_archived - log_applied) log_gap from (select max(sequence#) log_archived,thread# from gv$archived_log where dest_id = 1 and archived = 'YES' group by thread#) a ,(select max(sequence#) log_applied,thread# from gv$archived_log where dest_id = 2 and APPLIED = 'YES' group by thread#) b where a.thread#=b.thread#;
如果log_gap相差>50的话,要进行pr的归档备份,否则直接处理好dr然后开启MRP同步进程即可
(2)将pr的log_archive_dest_2置空(场景2可根据情况忽略此步骤)
如果场景2,pr的归档目录没有爆满,可以忽略此步骤,否则也需要将pr的log_archive_dest_2置空。置空的目的是备份归档后能自动删除归档,若非空,归档备份不能被自动删除
alter system set log_archive_dest_2='' scope=both;
(3)手动跑一下pr的归档备份脚本
脚本一般是rmanlog.sh,root执行
su - oracle -c "/rmancc/shell/rmanlog.sh" 1>> /rmancc/shell/rmanlog.log 2>>/rmancc/shell/rmanlog.err
(4)检查归档是否被成功备份和删除(场景2可根据情况忽略此步骤)
(5)恢复log_archive_dest_2(场景2可根据情况忽略此步骤)
恢复原来 log_archive_dest_2配置,如
alter system set log_archive_dest_2='SERVICE=dr_cc LGWR ASYNC valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=dr_cc' scope=both;
(6)将归档备份集传输到dr
传输的过程中可以控制scp速率
scp -l 500000 *log* dr_ip:/rmancc/ccbak
(7)将备份集恢复到dr
catalog start with '/rmancc/ccbak';
看看当前dr归档路径的最大的sequence值
如图,已经传到339576,然后此值之后的sequence都需要恢复,执行
restore archivelog from logseq 339576;
保证最后dr的归档路径归档sequence没有缺失和断层,然后开启dr的MRP进程即可
alter database recover managed standby database disconnect from session;
总结:
针对pr端归档不缺的情形,我们可以采用此种方式恢复dr,但是如果pr的归档缺失了,就无法通过此种方式恢复dr,需要参考另一种方式: