暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

ADG GAP修复场景3_主库上归档文件不存在无新增数据文件_unresolvable gap

原创 董小姐 2025-03-15
96

该文档场景:主库上归档文件不存在,主库集群状态unresolvable gap,主库无新增数据文件

模拟gap

首先,模拟备库断电,主库切几个最新的归档,然后手工删掉,重新开启DG同步。

备库停止DG同步进程

sqlplus / as sysdba
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
select process,status from v$managed_standby;
shutdown immediate
复制

v$managed_standby视图中MRP进程会消失。

PROCESS STATUS

--------- ------------

MRP0 APPLYING_LOG

主库切换多次归档

sqlplus / as sysdba
alter system switch logfile;
复制

主库删除最近几个归档日志

--查看归档路径
SYS@fuwa SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
Archive destination	       /oradata/archivelog
Oldest online log sequence     24
Next log sequence to archive   26
Current log sequence	       26

--操作系统磁盘上删除归档日志文件
cd /oradata/archivelog && ls -lhtr
-rw-r----- 1 oracle oinstall 1.3M Mar  5 09:16 1_20_1194792401.dbf
-rw-r----- 1 oracle oinstall 989K Mar  5 09:37 1_21_1194792401.dbf
-rw-r----- 1 oracle oinstall  24M Mar  5 17:09 1_22_1194792401.dbf
-rw-r----- 1 oracle oinstall 1.5K Mar  5 17:09 1_23_1194792401.dbf
-rw-r----- 1 oracle oinstall 3.5K Mar  5 17:09 1_24_1194792401.dbf
-rw-r----- 1 oracle oinstall 1.0K Mar  5 17:09 1_25_1194792401.dbf

[oracle@db01:/oradata/archivelog]$ rm -f 1_21*
[oracle@db01:/oradata/archivelog]$ rm -f 1_22*
[oracle@db01:/oradata/archivelog]$ rm -f 1_23*
[oracle@db01:/oradata/archivelog]$ rm -f 1_24*
[oracle@db01:/oradata/archivelog]$ rm -f 1_25
复制

备库开启同步进程

startup
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
复制

查主备同步状态

v$database中SWITCHOVER_STATUS状态有以下值,区别如下:

RESOLVABLE GAP 归档都在,可以自己解决

UNRESOLVABLE GAP 归档丢了,解决不了

主库

SWITCHOVER_STATUS状态 TO STANDBY

--主库信息   switchover显示to standby或者session active为正常
set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;
复制

输出如下:

set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;

NAME										 OPEN_MODE			DATABASE_ROLE	 PROTECTION_MODE      SWITCHOVER_STATUS
-------------------------------------------------------------------------------- ------------------------------ ---------------- -------------------- --------------------
DXJ										 READ WRITE			PRIMARY 	 MAXIMUM PERFORMANCE  UNRESOLVABLE GAP 
复制

备库

--备库信息
set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;
复制

输出如下:

set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;

NAME	  OPEN_MODE			 DATABASE_ROLE	  PROTECTION_MODE      SWITCHOVER_STATUS
--------- ------------------------------ ---------------- -------------------- --------------------
DXJ	  READ ONLY WITH APPLY		 PHYSICAL STANDBY MAXIMUM PERFORMANCE  NOT ALLOWED
复制

分析过程

查主备同步状态

法一:v$database

SWITCHOVER_STATUS状态有以下值,区别如下:

RESOLVABLE GAP 归档都在,可以自己解决

UNRESOLVABLE GAP 归档丢了,解决不了

主库

SWITCHOVER_STATUS状态 UNRESOLVABLE GAP说明主库和备库之间存在 GAP

--主库信息   switchover显示to standby或者session active为正常
set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;
复制

输出如下:

SYS@fuwa SQL> select name,open_mode,database_role,protection_mode,switchover_status from v$database;

NAME	  OPEN_MODE			 DATABASE_ROLE	  PROTECTION_MODE      SWITCHOVER_STATUS
--------- ------------------------------ ---------------- -------------------- --------------------
FUWA	  READ WRITE			 PRIMARY	  MAXIMUM PERFORMANCE  UNRESOLVABLE GAP
复制
备库
--备库信息
set linesize 999
col open_mode for a30
select name,open_mode,database_role,protection_mode,switchover_status from v$database;
复制

输出如下:

SQL> select name,open_mode,database_role,protection_mode,switchover_status from v$database;

NAME	  OPEN_MODE			 DATABASE_ROLE	  PROTECTION_MODE      SWITCHOVER_STATUS
--------- ------------------------------ ---------------- -------------------- --------------------
FUWA	  READ ONLY WITH APPLY		 PHYSICAL STANDBY MAXIMUM PERFORMANCE  NOT ALLOWED
复制

法二:v$archive_dest_status

视图V$ARCHIVE_DEST_STATUS存储归档位置状态信息,这些信息是未从当前节点读取,而是从归档日志文件中收集而来的,可显示指定归档注册组或归档位置的归档日志的当前位置、传输状态等信息。

该视图在主库查

主库
select status,recovery_mode,gap_status from v$archive_dest_status;
复制

输出如下:

SYS@fuwa SQL> select status,recovery_mode,gap_status from v$archive_dest_status;

STATUS	  RECOVERY_MODE 	  GAP_STATUS
--------- ----------------------- ------------------------
VALID	  IDLE
VALID	  MANAGED REAL TIME APPLY UNRESOLVABLE GAP
INACTIVE  IDLE
INACTIVE  IDLE
......

31 rows selected.
复制
备库
select status,recovery_mode,gap_status from v$archive_dest_status;
复制

输出如下:

SQL> select status,recovery_mode,gap_status from v$archive_dest_status;

STATUS	  RECOVERY_MODE 	        GAP_STATUS
--------- ----------------------- ------------------------
VALID	  MANAGED REAL TIME APPLY
VALID	  IDLE			                NO GAP
......

31 rows selected.
复制

检查数据库mrp 进程

主库

set line 200 pages 300
select process, client_process, sequence#,thread#,status from v$managed_standby;
复制

输出如下:

PROCESS   CLIENT_P  SEQUENCE#	 THREAD# STATUS
--------- -------- ---------- ---------- ------------
ARCH	  ARCH		   33	       1 OPENING
ARCH	  ARCH		   34	       1 CLOSING
ARCH	  ARCH		   35	       1 CLOSING
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		   30	       1 CLOSING
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		   39	       1 CLOSING
ARCH	  ARCH		   39	       1 CLOSING
ARCH	  ARCH		   37	       1 CLOSING
ARCH	  ARCH		   38	       1 CLOSING
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		   32	       1 CLOSING
ARCH	  ARCH		   33	       1 CLOSING
LNS 	  LNS		     40	       1 WRITING

31 rows selected.
复制

备库

set line 200 pages 300
select process, client_process, sequence#,thread#,status from v$managed_standby;
复制

输出如下:

PROCESS   CLIENT_P  SEQUENCE#	 THREAD# STATUS
--------- -------- ---------- ---------- ------------
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		   39	       1 CLOSING
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
ARCH	  ARCH		    0	       0 CONNECTED
RFS	    ARCH		    0	       0 IDLE
RFS	    UNKNOWN	    0	       0 IDLE
RFS	    LGWR		   40	       1 IDLE
MRP0	  N/A		     33	       1 APPLYING_LOG

34 rows selected.
复制

查询数据库中的scn

查询出备库当前scn 号与主库scn 相差比较大,到主库寻找相应的归档,已经没有,所以,只能对主库进行rman 增量备份。

主库

select to_char(current_scn) from v$database;
select distinct MIN(to_char(checkpoint_change#)) FROM V$DATAFILE_HEADER;
复制

输出如下:

select to_char(current_scn) from v$database;

TO_CHAR(CURRENT_SCN)
----------------------------------------
1108835

SYS@fuwa SQL> select distinct MIN(to_char(checkpoint_change#)) FROM V$DATAFILE_HEADER;

MIN(TO_CHAR(CHECKPOINT_CHANGE#))
----------------------------------------
1107442
复制

备库

取最小的那个值1105290

说明:

上面一个为控制文件中记录的SCN号

另一个为数据文件头记录的SCN号

需要选择较小SCN号(1105290)在主库上进行增量备份

有些场景如下查询发现显示0或是空,这种情况,以第一个查询获取到的值为准

select to_char(current_scn) from v$database;
select distinct MIN(to_char(checkpoint_change#)) FROM V$DATAFILE_HEADER;
复制

输出如下:

select to_char(current_scn) from v$database;

TO_CHAR(CURRENT_SCN)
----------------------------------------
1105290

SQL> select distinct MIN(to_char(checkpoint_change#)) FROM V$DATAFILE_HEADER;

MIN(TO_CHAR(CHECKPOINT_CHANGE#))
----------------------------------------
1105291
复制

主库查看备库当前scn号对应的归档时间

select scn_to_timestamp(1105290) scn from dual;

注意:
1105290对应的值是
select to_char(dbms_flashback.get_system_change_number) scn from dual;的值
复制

输出如下:

sys@TOPICIS 2024-10-21 22:16:34> select scn_to_timestamp(1105290) scn from dual;

SCN
---------------------------------------------------------------------------
06-MAR-25 09.18.02.000000000 AM
复制

查主库是否在scn后增加过数据文件

如果任何数据文件在备份SCN(在例子中是scn 1105290)之后被添加到主数据库,那么无论standby_file_management参数设置如何,这些数据文件都不会自动在备用服务器上创建。需要将添加的数据文件恢复到备用服务器。有关更多详细信息,请参阅以下内容:注意:1531031.1在数据文件被添加到主数据库时使用RMAN增量备份向前滚动备用数据库的步骤)

SELECT FILE#,NAME FROM V$DATAFILE WHERE CREATION_CHANGE#>=1115613;

SELECT FILE#,NAME FROM V$TEMPFILE WHERE CREATION_CHANGE#>=1115613;
复制

均无输出

查看日志应用情况

注意:

REGISTRAR = RFS and APPLIED = NO:--然后日志文件已经收到,但是还没有被应用。

REGISTRAR = RFS and APPLIED = IN-MEMORY:--日志文件被应用到内存中,但是数据文件还没有被更新

REGISTRAR = RFS and APPLIED = YES:--然后应用日志文件并更新数据文件

主库

set lines 200 pages 2000
col name for a80
select name,thread#,sequence#,REGISTRAR,applied,status from v$archived_log where applied='NO';
复制

输出如下:

备库

set lines 200 pages 2000
col name for a80
select name,thread#,sequence#,REGISTRAR,applied,status from v$archived_log where applied='NO';
复制

输出如下:

查看备库是否有standby log

--查询日志组
set linesize 999
col MEMBER for a60
select b.thread#,a.group#,a.member,bytes/1024/1024,b.members,b.status from v$logfile a,v$log b where a.group#=b.group# order by a.group#;

--查询日志组
col member for a60
select group#,member from v$logfile order by 1;
    GROUP# MEMBER
---------- --------------------------------------------------
	 1 /u01/app/oracle/oradata/dhh/redo01.log
	 2 /u01/app/oracle/oradata/dhh/redo02.log
	 3 /u01/app/oracle/oradata/dhh/redo03.log
	 4 /u01/app/oracle/oradata/dhh/redo04.log
	 5 /u01/app/oracle/oradata/dhh/redo05.log
	 6 /u01/app/oracle/oradata/dhh/redo06.log
	 7 /u01/app/oracle/oradata/dhh/redo07.log

select group#,thread#,sequence#,bytes,status from v$standby_log;
    GROUP#    THREAD#  SEQUENCE#      BYTES STATUS
---------- ---------- ---------- ---------- --------------------
	 4	    0	       0   52428800 ACTIVE
	 5	    0	       0   52428800 UNASSIGNED
	 6	    0	       0   52428800 UNASSIGNED
	 7	    0	       0   52428800 UNASSIGNED
复制

恢复步骤

备库取消实时日志应用

--备库关闭日志实时应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
复制

查看GAP

在备库查询,如果在主库查询返回0行

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

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

📢 注意: 当前DG数据库已存在GAP,GAP日志为:22~25。

在主库上创建一个备库的控制文件

alter database create standby controlfile as '/home/oracle/standby.ctl';
复制

以备库的当前SCN号为起点,在主库上做一个增量备份

备库查询当前 scn 号:

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

select distinct MIN(to_char(checkpoint_change#)) FROM V$DATAFILE_HEADER;
复制

确认主备GAP期间是否新增数据文件:

本案例中主库无新增数据文件,返回0行。

sqlplus / as sysdba
select file# from v$datafile where creation_change# > =1050331;
复制

主库根据备库scn号进行增量备份:

rman target /
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup INCREMENTAL from scn 1050331 database format '/home/oracle/incre_%U';
release channel c1;
release channel c2;
}
复制

📢 注意: 如果存在新增数据文件,备库恢复时需要先restore新添加的数据文件。本文档案例中主库无新增数据文件。

将增量备份和控制文件拷贝到备库上

主库拷贝增量备份和控制文件至备库:

cd /home/oracle
scp incre_0* oracle@db02:/home/oracle
scp standby.ctl oracle@db02:/home/oracle
复制

📢 注意: 确认备库的磁盘空间是否足够存放。

如果主库归档较大,备库磁盘剩余空间较小,可将备库的归档全删,主库保留2-3天归档

主库删除归档:

crosscheck archivelog all;
delete noprompt expired archivelog all;
list archivelog all completed before 'sysdate-1';
delete FORCE archivelog all completed before 'sysdate-1';
复制

备库删除所有归档:

crosscheck archivelog all;
delete noprompt expired archivelog all;
list archivelog all;
DELETE FORCE ARCHIVELOG ALL;
复制

使用新的控制文件将备库启动到mount状态

备库关闭数据库实例,开启至nomount状态:

sqlplus / as sysdba
shutdown immediate
startup nomount
复制

备库恢复新的控制文件:

rman target /
restore controlfile from '/home/oracle/standby.ctl';
复制

备库开启到mount状态:

alter database mount;
复制

增量备份注册到RMAN的catalog,取消日志应用,恢复增量备份

确认备库已关闭DG同步进程

sqlplus / as sysdba
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
复制

备库rman注册增量备份文件

rman target /
catalog start with '/home/oracle/';
YES
复制

备库开启恢复增量备份

rman target /
recover database noredo;
复制

清空日志组(根据场景变通)

如果采用了standby log则不需要清空,如果没有采用standby log模式,有几组需要清空几组

--查询日志组
select group#,bytes from v$log;

    GROUP#	BYTES
---------- ----------
	 1   52428800
	 2   52428800
	 3   52428800

--清空日志组
alter database clear logfile group 1;
alter database clear logfile group 2;
alter database clear logfile group 3;
复制

开启备库的恢复进程

备库开启日志同步进程:

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

或并行
alter database recover managed standby database parallel 10 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;
复制

查询是否存在GAP,确认主备是否同步

备库操作

sqlplus / as sysdba
SELECT * FROM V$ARCHIVE_GAP;
SELECT max(sequence#) from v$archived_log where applied='YES';
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
复制

至此,DG GAP已被修复,以上方式为常规修复方式,各个版本都通用。

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

评论