该文档场景:主库上归档文件不存在,主库集群状态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已被修复,以上方式为常规修复方式,各个版本都通用。