Dataguard GAP修复

11G Dataguard GAP修复

GAP是怎么产生的

一般在dg配置好后,除非有专人维护,不然很少有人会去检查dg状态,这往往会导致,因各种原因备库已经长时间未与主库同步,等发现的时候,主库的归档日志已经删除,备库无法再次与主库同步,这时候GAP就产生了。

可通过以下命令在备库查看主备库GAP

sqlplus / as sysdba
SELECT * FROM V$ARCHIVE_GAP;
THREAD#    LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
 1     198     201

SELECT max(sequence#) from v$archived_log where applied='YES';
MAX(SEQUENCE#)
--------------
198

上述查询结果说明归档日志只传到198#,199#、200#、201#没有传到备库来。可此时主库的199-201#日志可能已经被删除了,备库不可能通过应用主库日志的方法来同步,所以要通过备份恢复的方法来追上和主库的数据差距。

如果主库归档日志还存在那就好处理了
首先在主库上找到备库缺失的归档日志

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 199 AND 201 ;
name
---------------------
/u01/archivelog/1_199_1078960375.dbf
/u01/archivelog/1_200_1078960375.dbf
/u01/archivelog/1_201_1078960375.dbf

将备库缺失的日志从主库拷贝过来,在备库重新应用一下日志就行了。

如果日志在主库已经删除就使用下面的方法。

1.没有生产环境,接下来模拟一个GAP环境

停止备库同步

sqlplus / as sysdba
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
shutdown immediate

主库切换几次日志

sqlplus / as sysdba
alter system switch logfile;

我这里切换3次日志
切换3次
切换3次日志产生了3个归档,199#200#201#,此时备库的日志传输已经关闭,所以这三个归档不会传输到备库
在这里插入图片描述
然后删除,或者将这3个日志移动到归档路径意外,模拟日志删除。
rm/mv 1_199_…dbf

重新在备库应用日志。

alter database recover managed standby database using current logfile disconnect from session;

至此,GAP已经产生,通过查询主备同步状态发现主备库已经无法继续同步。

在备库查看GAP

sqlplus / as sysdba
SELECT * FROM V$ARCHIVE_GAP;
THREAD#    LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
 1     198     201  --GAP与日志号相对

SELECT max(sequence#) from v$archived_log where applied='YES';
MAX(SEQUENCE#)
--------------
198

2.修复GAP

a.在主库创建备库控制文件

alter database create standby controlfile as '/u01/standby.ctl';

b.在主库以备库scn为起点做增量备份

在备库查询当前scn
(1)这个是控制文件中的scn

sqlplus / as sysdba
select  to_char(current_scn) from v$database;
TO_CHAR(CURRENT_SCN)
----------------------------------------
2991877

(2)这个是数据文件头部的scn

SQL> select min(checkpoint_change#) from v$datafile_header where file# not in (select file# from v$datafile where enabled = 'READ ONLY');

MIN(CHECKPOINT_CHANGE#)
-----------------------
              2991878

我们一般以控制文件中的scn或者较小的scn为准

rman target /
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup INCREMENTAL from scn 2991877 database format '/u01/incre_%U';
release channel c1;
release channel c2;
}

注:如果在备库与主库存在GAP的时间段内,主库新增了数据文件,在备库做增量恢复前需要先restore新增的数据文件。

在主库查询后发现主库新增了数据文件

sqlplus / as sysdba
select file# from v$datafile where creation_change# > =2991877;
FILE# NAME
------ -----------------------------------------------
    21 /u01/app/oracle/oradata/tps_data16.dbf
    22 /u02/oradata/tps_data17.dbf

所以备库在做恢复前要先restore新增的数据文件。

将控制文件和增量备份拷贝至备库
在这里插入图片描述

c.备库用新控制文件启动到mount

sqlplus / as sysdba
shutdown immediate
startup nomount
rman target /
restore controlfile from '/u01/standby.ctl';
sqlplus / as sysdba
alter database mount;

d.在备库用主库的增量备份恢复

确认备库已停止同步。
在这里插入图片描述
注册增量备份文件

rman target /
catalog start with '/u01/bak/';
YES

在这里插入图片描述
开始恢复
如果主库新增了数据文件需要先执行下面这步,restore datafile file#;如果没有新增可直接recover database noredo;

从库还原新增的数据文件
RMAN>restore datafile 21;
RMAN>restore datafile 22;

其实也可以不提前这一步,如果有新添加的数据文件没有restore的话,在recover数据库的时候会有提示如下:
在这里插入图片描述
如果有提示 ,你就按照提示restore datafile 153;就行了

RMAN>recover database noredo;

在这里插入图片描述
此时查询备库GAP,已经没有了。

e.备库重新开启同步

恢复完成后备库可开启同步

sqlplus / as sysdba
alter database open read only;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

可以重新激活一下主库同步参数 --可能也不用,我没做。

sqlplus / as sysdba
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=defer;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=enable;

此时DG同步状态应该就正常了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值