我们首先在备库1上查看SCN的情况。
idle> col CURRENT_SCN format 99999999999999999999999999999
idle>SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
------------------------------
188670376120
备库2上的SCN情况如下:
SQL> col CURRENT_SCN format 99999999999999999999999999999
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
------------------------------
188611153769
可以看到延迟已经很大了。可能通过这个数字对比还不够明显。从后台日志可以看到,上一次启动到READ ONLY的时候是在3月份了,也就意味着这个问题已经过去了快半年了。这种情况下增量恢复还有希望吗,在主库端查看了下最近的归档情况,发现这个数据库的数据变更频率很低,基本是每天一次,所以近半年的时间大概是150~180个左右的归档,好像还能勉强接受。
在备库1增量导出的情况如下,我们基于SCN 188611153769,也就是备库2上一个较旧的SCN
[@TEST.test.com backup_stage]$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Mon Aug 15 11:32:56 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: TEST (DBID=1731005384, not open)
RMAN> BACKUP INCREMENTAL FROM SCN 188611153769 DATABASE FORMAT '/home/oracle/backup_stage/stest2_%U' tag 'FORSTANDBY';
在真实环境尝试,和实验还是有很大的差别,短暂的等待后竟然抛出了一个错误。
不过虚惊一场,这个是备份的路径问题,导致空间不足,切换了一个路径再次尝试,很快就完成了,大概用了7分钟的时间。
这个时候拷贝到备库2上会恢复,当然还是需要先恢复控制文件,可以从主库生成一个镜像过去,或者从备库2拷贝也可以。
否则在恢复的时候会抛出类似下面的错误。
备库2先注册这个增量备份,/U01/backup_stage/increment_backup是增量备份存放的路径
[@stest4.test.com ~]$ rman target /
RMAN> catalog start with '/U01/backup_stage/increment_backup';
Starting implicit crosscheck backup at 15-AUG-16
using target database control file instead of recovery catalog
采用下面的方式恢复:
RMAN> recover database noredo ;
恢复的时间更短,大概是1分多钟。
后台的日志会输出类似下面的内容:
恢复后查看SCN的情况如下,已经有了更新。
SQL> col CURRENT_SCN format 9999999999999999999999
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------------------
188670376925
后面所做的就是开启恢复模式。
SQL> recover managed standby database disconnect from session;
Media recovery complete.
这个时候查看数据库日志就会发现备库2很快就追评了归档GAP,一切又恢复了正常。
通过这个案例可以看到Data Guard的恢复在有些时候还是有一些捷径可走,明白了原理,加上点运气,问题就可以引刃而解。