暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

Oracle ADG 搭建完成后处于 WAIT_FOR_GAP 状态问题处理

744

前 言

最近两个月前遇到网友有一套云上的单机的 11g DG,去年通过某云搭建好了 ADG 环境,但今年中由于网络原因导致主库的归档日志还没有传递到备库就被强制删除了,进而导致 ADG 备库出现 GAP。原以为这个问题比较简单,通过增量备份恢复就好了,因为不是 19c 版本没法通过 from service 的方式恢复,感兴趣的可查看如下文章。

Oracle ADG 备库停启维护步骤及增量恢复
利用 Oracle 19c 新特性 from service 修复备库 GAP

facebook_pro_light_1920 × 1080  副本.png

正 文

因归档丢失出现 GAP 如果需要的归档日志有备份,直接恢复出所需要的归档,然后拿到备库去注册就行,如果没有备份归档,那么则需要重建或者增量恢复,如果库比较大,则增量恢复。当使用正常的流程增量恢复后,应用日志开启 MRP0 进程却不同步日志,状态是 WAIT_FOR_GAP 等待几年前的已经不存在的归档号 16754。如下图所示:

图片.png

一度怀疑他是不是没有按照我的步骤做恢复,因为平时上班期间也不能远程,排查无果,没办法只能让其全库恢复了,使用如下命令进行 rman 全备,然后传递到备库做恢复。

rman target /
run {
  allocate channel c1 type disk ;
  allocate channel c2 type disk ;
  allocate channel c3 type disk ;
  allocate channel c4 type disk ;
  backup  as compressed backupset database format '/backup/backup20240830/%d_%I_%s_%p.bak';
  backup  as compressed backupset archivelog all format '/backup/backup20240830/%d_%I_%s_%p.arc';
  backup current controlfile for standby format '/backup/backup20240830/%d_%I_%s_%p.ctl';
  release channel c1;
  release channel c2;
  release channel c3;
  release channel c4;
}

--将备份传输至备库
[oracle@jiekexu rmanbk]$ scp beijing_3078169696_* 192.168.3.105:/backup/backup20240830/

--备库操作
SQL> startup nomount

rman target /
RMAN> restore standby controlfile from '/backup/backup20240830/JiekeXu_1470960497_14179_1.ctl';
RMAN> sql 'alter database mount';

--注册从源数据库拷贝过来的备份集到 rman 中
RMAN> catalog start with'/backup/backup20240830/';
……
Do you really want to catalog the abovefiles (enter YES or NO)? yes

--恢复数据库
run {
 allocate channel c1 type disk;
 allocate channel c2 type disk;
 allocate channel c3 type disk;
 allocate channel c4 type disk;
 restore database;
 recover database;
 release channel c1;
 release channel c2;
 release channel c3;
 release channel c4;
}
复制

进行全量备份恢复后,应用日志开启 MRP0 进程,alert 日志中也没有任何报错,但还是不同步日志,状态也是 WAIT_FOR_GAP 等待几年前的已经不存在的归档号 16754。如下图所示:

图片.png

图片.png

问题根因

最终通过排查发现,源库有一个 43 号数据文件处于“RECOVER”状态。

SQL> select file#,CREATION_TIME,ts#,status,ENABLED from v$datafile where file#=43;

     FILE# CREATION_        TS# STATUS  ENABLED
---------- --------- ---------- ------- ----------
        43 23-JUN-19          6 RECOVER READ WRITE

SQL> select file_id,file_name,status from dba_data_files where tablespace_name='STS_01' and file_id=43;

   FILE_ID FILE_NAME                                                                                STATUS
---------- ---------------------------------------------------------------------------------------- ---------
        43 /u01/oracle/oradata/prod/sts_01.20190623_5.dbf                                      AVAILABLE	
复制

查看 alert 日志发现这个 43 号文件在 22 年的时候就被 drop 过,后面做过 “RECOVER” 但是一直没有 online,幸好这个数据文件上也没有存放数据,不然可能导致数据丢失的风险。

SELECT e.segment_name, e.segment_type
FROM dba_extents e
JOIN dba_data_files f ON e.file_id = f.file_id
WHERE f.file_id=43;
复制

注意:如果查出有数据,那么需要联系业务人员再三确认这些对象可以删除,如果没有备份,那么恢复起来就比较困难了,具体还需要进一步判断数据对象是什么,通过非常规手段进行异常数据恢复。

解决问题

那么,通过查看 alert 日志发现这个数据文件以前主库就被删除过,且去年搭建 DG 的时候也 drop 过这个文件,经过再三确定可以删除这个文件,那就干吧。

SQL> startup mount
ORACLE instance started.

Total System Global Area 1.5500E+11 bytes
Fixed Size                  2261448 bytes
Variable Size            2.0938E+10 bytes
Database Buffers         1.3368E+11 bytes
Redo Buffers              376410112 bytes
Database mounted.
SQL> 
SQL> 
SQL> select file#,CREATION_TIME,ts#,status,ENABLED from v$datafile where file#=43;

     FILE# CREATION_TIME              TS# STATUS  ENABLED
---------- ------------------- ---------- ------- ----------
        43 2019-06-23 22:59:20          6 RECOVER READ WRITE

SQL> 
SQL> alter database datafile 43 offline;
alter database datafile 43 offline
*
ERROR at line 1:
ORA-01668: standby database requires DROP option for offline of data file


SQL> alter database datafile 43 offline drop;

Database altered.

SQL> !
[oracle@cis ~]$ ll /u02/oracle/oradata/prod/ts_01.20190623_5.dbf
-rw-r----- 1 oracle oinstall 33286004736 Aug 31 22:15 /u02/oracle/oradata/prod/ts_01.20190623_5.dbf
复制

执行后此命令不会立即删除磁盘上的物理文件。这个命令的作用是将数据文件 ID 为 43 的数据文件将被标记为离线并从数据库控制文件中删除,但它不会自动删除物理磁盘上的文件。

通过这个操作后,重启 MRP 进程,查看状态以及变为 APPLYING_LOG,不一会儿 apply lag 也变成了 0,算是恢复正常了。

图片.png

问题总结

如果主库有处于 recover 状态的数据文件无法通过 rman 备份,更加搭建不了一个正常同步的 ADG。

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

❤️ 欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

最后修改时间:2024-11-01 10:08:39
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 前 言
  • 正 文
  • 问题根因
  • 解决问题
  • 问题总结