oracle DG gap解决

oracle物理dg gap解决

查看GAP量
 
   

gap较多,在primary 做基于scn的backup,同时创建一个新的standbycontrolfile,将备份好的backupset ,standbycontrolfile 拷贝的备库的相应目录下,进行restore、recover的操作即可因为这个案例中,standby丢失的归档太多,推荐用第二种方法

(1)      standby 取消recover

SQL> select * from v$archive_gap ;

 

THREAD#   LOW_SEQUENCE#     HIGH_SEQUENCE#
------------ ----------------------- ----------------------
1                  99                               109
从上面的信息可以看出,备库中缺失了99到109的日志。

SQL> alter database recover managed standby database cancel;

 

(2)      在主库v$archived_log查询gap中LOW_SEQUENCE#-1对应的scn(即:first_change#)

SQL>select THREAD#,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE#from v$archived_log where SEQUENCE#=98;

  THREAD#    SEQUENCE#   FIRST_CHANGE#    NEXT_CHANGE#

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

         1      481     542543    551725

 

(3)      在primary做基于该scn的增量备份

RMAN> run {

allocate channel c1 device type disk;

allocate channel c2 device type disk;

backup incremental from scn 542543 database format '/oradata/bak/ora_scn_%U.bak';    #incremental单词不要写错

release channel c1;

}

###################带压缩的语法

RUN { 

 ALLOCATE CHANNEL D1 TYPE DISK; 

 ALLOCATE CHANNEL D2 TYPE DISK; 

 ALLOCATE CHANNEL D3 TYPE DISK; 

 ALLOCATE CHANNEL D4 TYPE DISK; 

 BACKUP AS COMPRESSED BACKUPSET INCREMENTAL FROM SCN 750983 DATABASE FORMAT '/ARCHIVE/STANDBY_NEW_%D_%T_%U.BAK' INCLUDE CURRENT CONTROLFILE FOR STANDBY FILESPERSET=5  TAG 'FOR STANDBY NEW'; 

 RELEASE CHANNEL D1; 

 RELEASE CHANNEL D2; 

 RELEASE CHANNEL D3;

 RELEASE CHANNEL D4;

}

list backupset of controlfile;--找到控制文件的备份集文件名

 

(4)      在primary创建新的standby controlfile

SQL> alter database create standby controlfile as '/oradata/bak/control.ctl';

 

(5)      将增量的备份集和创建好的standby controlfile 拷贝的备库

 

 

(6)      使用新的standby controlfile 启动备库到mount

 

在使用RMAN恢复备库的控制文件之前,需要将原来的控制文件进行手工的冷备并且记录下原来的控制文件中记录的数据文件的名称

SELECT ''''||NAME||''' ;' FROM V$DATAFILE; --记录备库数据文件原名称及路径

cp +DATA/oranlhr/controlfile/control01.ctl +DATA/oranlhr/controlfile/control01.ctl_bk

 

 

(7)      备库shutdown,恢复控制文件

SQL> shutdown immediate

startup force nomount

restore standby  controlfile from '/home/oracle/bak/standby_TESTDG_20180525_19t3q9sb_1_1.bak';

select 'alter database rename file '''||NAME ||''' TO ' FROM V$datafile; --查询恢复控制文件后备库数据文件的名称,如果不对的话需要更改

 

 

(8)启动备库到mount状态注册归档进来

ALTER DATABASE MOUNT; 

CATALOG START WITH '/ARCHIVE/';

 

 

若备库是rac,或者asm存储,则在还原控制文件后需要把控制文件中的数据文件重命名为备库的原数据文件名称才可以执行恢复操作。

--重命名备库的数据文件

alter system set standby_file_management=manual sid='*';

alter database rename file '+DATADG/testdg/datafile/system.274.976812987' TO '+DATADG/testdgphy/datafile/system.261.976877439';

......

alter database rename file '+DATADG/testdg/datafile/undotbs2.286.976813901' TO '+DATADG/testdgphy/datafile/undotbs2.257.976877619';

......

alter system set standby_file_management=auto sid='*';


 

在执行RECOVER DATABASE NOREDO前,应该让备库和主库都处于同一个incarnation,否则会报错

list incarnation of database;

reset database to incarnation 1;--应该和主库保持一致

 

--最后执行恢复操作

RECOVER DATABASE NOREDO;

 

(9)      验证结果

Standby 执行接收并恢复日志操作

SQL> alter atabase recover managed standby database disconnect from session;

SQL> select * fromv$archive_gap;

no rows selected

SQL> select THREAD#,max(SEQUENCE#) from v$archived_log group by THREAD#;

   THREAD# MAX(SEQUENCE#)

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

         1           3729

 

Primary端验证结果

 

SQL> select THREAD# ,max(SEQUENCE#) from v$archived_log  group by THREAD#;

   THREAD# MAX(SEQUENCE#)

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

1                                      3729

 

Primary进行日志切换,查看standby告警日志。

 
#################若需要恢复的文件比较多,则可以使用如下的SQL来查询恢复的进度:
SELECT A.USERNAME,
       (SELECT UPPER(NB.OSUSER) FROM V$SESSION NB WHERE NB.SID = A.SID) OSUSER,
       (SELECT NB.SID || ',' || NB.SERIAL# || ',' || PR.SPID
          FROM V$PROCESS PR, V$SESSION NB
         WHERE NB.PADDR = PR.ADDR
           AND NB.SID = A.SID
           AND NB.SERIAL# = A.SERIAL#) SESSION_INFO,
       A.TARGET,
       A.OPNAME,
       TO_CHAR(A.START_TIME, 'YYYY-MM-DD HH24:MI:SS') START_TIME,
       ROUND(A.SOFAR * 100 / A.TOTALWORK, 2) || '%' AS PROGRESS,
       (A.TIME_REMAINING) TIME_REMAINING,
       (A.SOFAR || ':' || A.TOTALWORK) SOFAR_TOTALWORK,
       (A.ELAPSED_SECONDS) ELAPSED_SECONDS,
       MESSAGE MESSAGE,
       (SELECT NB.EVENT FROM V$SESSION_WAIT NB WHERE NB.SID = A.SID) WAIT_EVENT,
       (SELECT NB.STATUS FROM V$SESSION NB WHERE NB.SID = A.SID) STATUS
  FROM V$SESSION_LONGOPS A
 WHERE A.TIME_REMAINING <> 0
 ORDER BY STATUS, A.TIME_REMAINING DESC, A.SQL_ID, A.SID;
 

在整个恢复过程中需要注意的几点:

 

① 若备库是rac,或者asm存储,则在还原控制文件后需要把控制文件中的数据文件重命名为备库的原数据文件名称才可以执行恢复操作。

② 在执行RECOVER DATABASE NOREDO前,应该让备库和主库都处于同一个incarnation,否则会报如下的错误,并且不能启用备库的实时日志应用功能:

 
 
 

逻辑DG手动解决GAP

在逻辑备库上查询DBA_LOGSTDBY_LOG视图可以确定是否有归档中断。例如,下面的查询指出断档号为16至18:

SYS@orclasm > COLUMN FILE_NAME FORMAT a60
SYS@orclasm > SELECT THREAD#, SEQUENCE#, FILE_NAME
  2    FROM DBA_LOGSTDBY_LOG L
  3   WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#)
  4   ORDER BY THREAD#, SEQUENCE#;
THREAD#    SEQUENCE# FILE_NAME  
--------- ---------- ---------------------------------------------  
1                 16 /arch/oracle/arch_1_16.arc
1                 18 /arch/oracle/arch_1_18.arc

接下来复制丢失的日志文件到逻辑备库,并在逻辑备库上使用“ALTER DATABASE REGISTER LOGICAL LOGFILE”来注册这些日志文件。例如:

SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE  '/arch/oracle/arch_1_16.arc';

在逻辑备库上注册这些日志文件之后,重启SQL应用。和物理DG一样,在逻辑备库上的DBA_LOGSTDBY_LOG视图只返回当前妨碍SQL应用继续的下一个中断。在解决指定的中断并重启SQL应用之后,再次在逻辑备库上查询DBA_LOGSTDBY_LOG视图,以确定下一个中断序号,如果有的话,重复这个过程直到没有更多的中断。

需要注意的是,如果需要的归档日志已经不在主库上了,但是有归档日志的RMAN备份,那么可以通过RMAN恢复把缺少的归档日志进行还原,如下所示:

SET ARCHIVELOG DESTINATION TO '/arch';
RESTORE ARCHIVELOG  FROM LOGSEQ 7;

如果断档的归档日志已经丢失,且RMAN又没有备份,那么在Oracle 10g之前没有办法修复了,只能重建DG,但是从Oracle 10g开始可以采用主库基于SCN的增量备份来恢复DG,详见【3.2.12.8 主库丢失归档,物理DG如何恢复?】。

 
参考小麦苗老师博客


posted @   悠游~~~  阅读(930)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示