当前位置: 首页 > news >正文

如何处理oracle 12c DG归档日志缺失(gap)导致备库同步中断问题

DG实验环境介绍:

instance_name

架构

主库

orcl

单实例

备库

orclstd

单实例

若着急处理故障,可跳过下面‘一 故障模拟’这一步,直接看‘二 解决办法’

一 故障模拟

这里通过在主库禁用归档日志传输,在主库mv几个归档日志,期间造几条数据,在主库新增个数据文件,模拟下归档日志丢失导致的备库同步中断,丢失数据的情况。

1.1 在主库禁用归档日志传输

alter system set log_archive_dest_state_2 =defer;

1.2 查看主备当前最新归档日志

SELECT NAME,SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

1.3 在主库造几条数据,切几次归档

这3条数据没同步到备库。

#主库

#备库

1.4 在主库模拟删除这几个归档

[oracle@host01 arch]$ mv 1_1173_1164727119.dbf 1_1173_1164727119.dbf_bak

[oracle@host01 arch]$ mv 1_1174_1164727119.dbf 1_1174_1164727119.dbf_bak

[oracle@host01 arch]$ mv 1_1175_1164727119.dbf 1_1175_1164727119.dbf_bak

1.5 在主库开启归档日志传输

alter system set log_archive_dest_state_2 =enable;

1.6 在备库查看归档日志gap

SQL> select * from v$archive_gap;

   THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#     CON_ID

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

         1          1173           1175          1

可以看到产生了gap。

之后主库产生的归档日志同步到备库了,但是SEQUENCE为1173和1175的没同步到备库。

而且故障之后的数据也没同步到备库。

1.7 在主库新增个表空间及数据文件

create tablespace user2 datafile '/data/app/oracle/oradata/orcl/users2_01.dbf' size 10m;

二 解决办法

2.1 查看备库v$dataguard_status有何报错

select message from v$dataguard_status;

最新报错:

FAL[client]: Error fetching gap sequence, no FAL server specified

SQL> alter system set fal_server=orcl;

select message from v$dataguard_status;

最新报错:

FAL[client]: Failed to request gap sequence

 GAP - thread 1 sequence 1173-1175

 DBID 1692507853 branch 1164727119

2.2 刷新备库控制文件

2.2.1 在备库查询当前SCN

select current_scn from v$database;

记录下查询出来的scn,这里是41050771,后面会用到。

2.2.2 保存备库当前rman配置

#在备库上操作

su - oracle

rman target / nocatalog log=/tmp/RMAN_settings.log << EOF

show all;

EOF

#移除没用的信息

grep ^CONFIGURE /tmp/RMAN_settings.log | grep -v 'RETENTION POLICY' >/tmp/RMAN_settings.rman

rm /tmp/RMAN_settings.log

2.2.3 刷新备库控制文件 --关键步骤

#在备库操作

shutdown immediate;

rman target / nocatalog

RMAN> startup nomount

RMAN> restore standby controlfile from service <tns alias for primary database>;

这里是 restore standby controlfile from service orcl;

2.2.4 替换RMAN配置

#替换RMAN配置

RMAN> alter database mount;

RMAN> @/tmp/RMAN_settings.rman

2.2.5 Catalog Standby Database Files to the Refreshed Control File

2.2.5.1 CATALOG START WITH DATAFILE

此时,刷新的控制文件具有来自主数据库的文件位置和元数据。使用RMAN CATALOG命令用备用数据库文件位置更新控制文件。

catalog start with '数据文件路径';

这里是:

catalog start with '/data/app/oracle/oradata/orclstd';

/*

SQL> select name from v$datafile;

NAME

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

/data/app/oracle/oradata/orclstd/system01.dbf

/data/app/oracle/oradata/orclstd/baidd02.dbf

/data/app/oracle/oradata/orclstd/sysaux01.dbf

/data/app/oracle/oradata/orclstd/undotbs01.dbf

/data/app/oracle/oradata/orclstd/baidd01.dbf

/data/app/oracle/oradata/orclstd/users01.dbf

*/

RMAN> catalog start with '/data/app/oracle/oradata/orclstd';

中间输入个YES

2.2.5.2 CATALOG START WITH REDO LOG

catalog start with '<RECO DISKGROUP>/<standby db_unique_name>/';

这里是:

/data/app/oracle/oradata/orclstd

/*

SQL> SELECT MEMBER FROM V$LOGFILE;

MEMBER

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

/data/app/oracle/oradata/orclstd/redo03.log

/data/app/oracle/oradata/orclstd/redo02.log

/data/app/oracle/oradata/orclstd/redo01.log

/data/app/oracle/oradata/orclstd/STANDBYREDO04.LOG

/data/app/oracle/oradata/orclstd/STANDBYREDO05.LOG

/data/app/oracle/oradata/orclstd/STANDBYREDO06.LOG

/data/app/oracle/oradata/orclstd/STANDBYREDO07.LOG

已选择 7 行。

*/

2.2.6 restore丢失的文件

如果在备库的SCN和刷新的控制文件的SCN之间创建过数据文件,则文件将丢失。

识别任何丢失的文件并恢复它们。

SQL> select file#,name from v$datafile where creation_change# >= 41050771;

     FILE# NAME

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

         8 /data/app/oracle/oradata/orclstd/users2_01.dbf

41050771是2.2.1 ‘在备库查询当前SCN’那里查询出来的值。

如果查询结果为空,则跳过该步骤,如果查询返回有内容,则必须还原文件。

run

{

set newname for database to orclstd;

restore datafile 8 FROM SERVICE orcl;

}

#上面标黄的orclstd是备库instance_name,8是备库比主库少的数据文件的FILE#,orcl是主库instance_name

2.2.7 Switch Database to Copy

RMAN> switch database to copy;

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-00571: ===========================================================

RMAN-03002: 位于 05/08/2025 14:45:18 的 switch to copy 命令失败

RMAN-06571: 数据文件 1 没有可恢复的副本

报这个错没关系,继续往下进行。

2.2.8 Clean Up Orphaned Files

如果在备用的SCN和刷新的控制文件的SCN之间删除了任何文件,则该文件仍将是RMAN中的数据文件副本。删除任何数据文件副本以删除不需要的文件。

RMAN> list datafilecopy all;

RMAN> delete datafilecopy all;

2.3 清理online redo log和standby log file

#在备库操作

SQL> select group#,member from v$logfile order by group#;

    GROUP# MEMBER

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

         1 /data/app/oracle/oradata/orclstd/redo01.log

         2 /data/app/oracle/oradata/orclstd/redo02.log

         3 /data/app/oracle/oradata/orclstd/redo03.log

         4 /data/app/oracle/oradata/orclstd/STANDBYREDO04.LOG

         5 /data/app/oracle/oradata/orclstd/STANDBYREDO05.LOG

         6 /data/app/oracle/oradata/orclstd/STANDBYREDO06.LOG

         7 /data/app/oracle/oradata/orclstd/STANDBYREDO07.LOG

alter database clear logfile group 1;

alter database clear logfile group 2;

alter database clear logfile group 3;

alter database clear logfile group 4;

alter database clear logfile group 5;

alter database clear logfile group 6;

alter database clear logfile group 7;

2.4 Roll the Standby Database Forward

2.4.1 将备库重新启动到mount状态

shutdown immediate;

startup mount;

2.4.2 执行Recover From Service --关键步骤

RMAN> recover database from service orcl noredo using compressed backupset;

这里的orcl是主库的instance_name

2.5 将数据库启动到open状态

alter database open;

2.6 开始应用日志日志

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE using current logfile DISCONNECT FROM SESSION;

SQL> select open_mode,database_role from v$database;

OPEN_MODE            DATABASE_ROLE

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

READ ONLY WITH APPLY PHYSICAL STANDBY

2.7 验证主库故障期间产生的数据是否恢复到了备库

可以看到丢失的归档日志对应的数据同步到了备库。

--本篇文章参考自:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=354541008397548&id=2850185.1&_adf.ctrl-state=byh8d5ycd_52

相关文章:

  • Android Studio Gradle 中 只显示 Tasks 中没有 build 选项解决办法
  • linux动态占用cpu脚本、根据阈值增加占用或取消占用cpu的脚本、自动检测占用脚本状态、3脚本联合套用。
  • 【Python】PDF文件处理(PyPDF2、borb、fitz)
  • 数据结构和算法
  • 印度股票市场API对接文档
  • 如何通过grep 排除“INTEGER: 1”
  • 中级网络工程师知识点2
  • Don’t Mesh with Me 论文阅读 brep llm
  • 系统架构-面向服务架构(SOA)
  • 【嵌入式开发-SDIO】
  • ResNet残差神经网络的模型结构定义(pytorch实现)
  • 为什么 MySQL 用 B+ 树作为数据的索引,以及在 InnoDB 中数据库如何通过 B+ 树索引来存储数据以及查找数据
  • 使用CubeMX新建SPI读写串行FLASH工程
  • IoT平台和AIoT平台的区别
  • M0芯片的基础篇Timer
  • RSAC 2025观察:零信任+AI=网络安全新范式
  • Python+ffmpeg 实现给视频添加字幕
  • Cut video with ffmpeg
  • 前端如何处理精度丢失问题
  • Python开发系统
  • 独家丨刘家琨获普利兹克奖感言:守护原始的感悟力
  • 人民时评:透过上海车展读懂三组密码
  • 习近平同俄罗斯总统普京茶叙
  • 少年中国之少年的形塑
  • 上海优化营商环境十大攻坚突破任务中,为何第一项是实施世行对标改革?
  • 超燃!走过莫斯科街头的“中国排面”