DataGuard缺少归档同步中断的恢复

梁铭图 2021-12-08 17:42:00
作者介绍

梁铭图,新炬网络首席架构师。具有十余年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM和ACE Director、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP、华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。

 

背景

 

某客户的生产环境数据库使用dataguard进行数据库灾备,生产数据库及灾备数据库的文件存储方式为ASM。由于备库的归档文件路径的磁盘空间不足,客户数据库管理员手动把归档日志文件删除了一部分,释放一些使用空间。但是经过排查发现重启灾备数据库后没有开启DG恢复模式,只是在接收主库传送过来的归档文件并没有应用到备库,导致删除备库归档日志文件脚本执行失败,造成归档路径磁盘空间不足。同时,由于删除了一部分没有应用到备库的归档文件,导致灾备数据库DG同步中断。

 

因此需要利用现有的数据库以及归档日志恢复数据同步。

 

运行环境

 

操作系统:HPUNIX

数据库版本:11.2.0.3

数据库配置:RAC

数据文件存储方式:ASM

 

问题处理

 

由于归档文件的丢失,备库恢复同步方式一般有如下两种:

 

  • 通过主库全库备份来恢复备库

  • 通过基于SCN备份主库来恢复备库

 

第一种方式适合数据库的数据量比较少,能过主库全库备份恢复备库。

 

第二种方式适合数据库的数据量比较大,主库全库备份时间较长,可以通过SCN备份方式增量恢复备库。

 

我们此次恢复备库采用第二种方式,基于SCN备份主库,主要步骤如下:

 

1.备库确认丢失归档信息

2.备库确认当前最小SCN号

3.主库通过基于SCN方式RMAN备份数据库

4.备库恢复数据库

5. 备库使用旧的控制文件采集数据文件路径信息

6. 备库恢复新的控制文件

7. 备库使用catalog datafilecopy命令扫描数据文件

8. 备库使用set newname 命令修改数据文件路径

9.主库备份缺失的数据文件

10.备库恢复新增加的数据文件

11.开启DG同步机制

 

1)备库确认丢失归档信息

 

在备库上执行查询:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> select * from v$archive_gap;   THREAD#   LOW_SEQUENCE#     HIGH_SEQUENCE#----------       -------------           --------------       2            27893                  28555SQL> SELECT PROCESS,CLIENT_PROCESS,SEQUENCE#,STATUS FROM V$MANAGED_STANDBY;PROCESS   CLIENT_P  SEQUENCE# STATUS--------- -------- ---------- ------------ARCH      ARCH          29358 CLOSINGARCH      ARCH          30774 CLOSINGARCH      ARCH          29359 CLOSINGRFS       UNKNOWN           0 IDLERFS       LGWR          29362 IDLERFS       N/A               0 IDLERFS       UNKNOWN           0 IDLEMRP0      N/A           27893 WAIT_FOR_GAPRFS       UNKNOWN           0 IDLERFS       LGWR          30776 IDLERFS       N/A               0 IDLE


SQL> select name,value from v$dataguard_stats;NAME                             VALUE-------------------------------- ------------------------------apply finish time                +00 16:52:12.9apply lag                        +94 04:21:02estimated startup time           22standby has been open            Ntransport lag                    +00 00:00:07

 

2)备库确认当前最小SCN号

 

在备库执行:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;SQL> col current_scn for 999999999999999SQL>  SELECT CURRENT_SCN FROM V$DATABASE;     CURRENT_SCN----------------     39597750709SQL>  select min(f.checkpoint_change#) from v$datafile_header f, v$datafile d  2   where f.file# =d.file#   and d.enabled != 'READ ONLY'  ;   MIN(F.FHSCN)----------------39597657793我们分别查出了备库的当前SCN和文件头的最小SCN,强烈建议使用文件头最小SCN在主库进行增量备份SQL>  ALTER SYSTEM SET standby_file_management='AUTO' SCOPE=BOTH;

 

在主库上执行:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
SQL> select FILE#,to_char(CREATION_TIME,'yyyy-mm-dd hh24:mi:ss') CREATION_TIME,STATUS,LAST_TIME,name from v$datafile where CREATION_CHANGE#> 39597657793; (备库小最SCN号) FILE# CREATION_TIME     STATUS  LAST_TIME NAME---------- --------------------  -------------- --------------------  ----   151 2017-07-13 online +DATA/xxxxxxx/datafile/*******.dbf  152 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf  153 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf  154 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf  155 2017-08-18 online +DATA/xxxxxxx/datafile/*******.dbf

 

通过上面查询得知在备库最小SCN号之后主库增加了五个数据文件,即151、152、153、154、155号数据文件
 

查询备库数据文件信息:
 

  •  
SQL> select file#, name from v$datafile;


备库查询数据文件没有相关此五个数据文件信息

 

3)主库通过基于SCN方式RMAN备份数据库

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#!/bin/ksh$ORACLE_HOME/bin/rman target /  log=/orabak/backup_20170823.log <<EOFrun{allocate channel t1 type disk;allocate channel t2 type disk;BACKUP as compressed backupset INCREMENTAL FROM SCN 39597657793(取备库最小SCN号) DATABASE FORMAT '/orabak/dg_%U' tag 'FORSTANDBY';release channel t1;release channel t2;}EOF

 

主数据库备份完毕后,备份一下主库的控制文件:
 

  •  
SQL> ALTER DATABASE CREATE standby controlfile AS '/orabak/standby.ctl';  

 

把备份集远程复制到备库:
 

scp  /orabak/*  16.1.14.201: /orabak

 

备库恢复数据库

 

备库启动到mount状态:

 

  •  
  •  
sqlplus / as sysdbastartup mount;

 

备份备库当前的控制文件:

 

  •  
  •  
rman target /backup current controlfile format ‘/orabak/stanby.ctl’;

 

在备库恢复之前,把主库的备份集信息注册到备库中:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
$ rman target /RMAN> CATALOG START WITH ‘/orabak';using target database control file instead of recovery catalogsearching for all files that match the pattern /lisgpfs/zaibei2017


List of Files Unknown to the Database=====================================File Name: /lisgpfs/zaibei2017/4567File Name: /lisgpfs/zaibei2017/backup_20170823.logFile Name: /lisgpfs/zaibei2017/backup_incr.shFile Name: /lisgpfs/zaibei2017/dg_7mrsnu6s_1_1File Name: /lisgpfs/zaibei2017/dg_7nrsnu6s_1_1File Name: /lisgpfs/zaibei2017/dg_7orso1ji_1_1File Name: /lisgpfs/zaibei2017/dg_7prso1jk_1_1File Name: /lisgpfs/zaibei2017/nohup.outFile Name: /lisgpfs/zaibei2017/standby_20170823.ctl

Do you really want to catalog the above files (enter YES or NO)? yes

 

4)在备库执行恢复数据库:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#!/bin/ksh$ORACLE_HOME/bin/rman target /  log=/orabak/recover_20170823.log <<EOFrun{allocate channel t1 type disk;allocate channel t2 type disk;recover database noredo;release channel t1;release channel t2;}EOF

 

5)备库收集数据文件路径信息

 

备库恢复完数据库后,备库使用当前的控制文件收集备库的数据文件路径信息

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
select file#,name from v$datafile;-----------------------------------------------------------  1  '+DATA/xxxxxxx/datafile/*******.dbf;                              2  '+DATA/xxxxxxx/datafile/*******.dbf;                              3  '+DATA/xxxxxxx/datafile/*******.dbf;                              4  '+DATA/xxxxxxx/datafile/*******.dbf;                              5  '+DATA/xxxxxxx/datafile/*******.dbf;                            
  ......                             
150  '+DATA/xxxxxxx/datafile/*******.dbf;     

              

可以看到备库当前控制文件保存的数据文件指针只有150个,而主库的数据文件已经为155个数据文件。

 

6)备库恢复控制文件

 

备库收集完数据文件路径信息后,需要恢复一下备库的控制文件,即此控制文件是从主库备份过来的控制文件,为最新的控制文件:

 

  •  
  •  
  •  
  •  
  •  
SQL> shut immediate;SQL>  startup nomount$ rman target /RMAN>  restore controlfile from '/lisgpfs/zaibei2017/standby.ctl';SQL> alter database mount;

 

7)备库使用catalog datafilecopy命令扫描数据文件

 

为了使备库新恢复的控制文件能够有原来备库上的数据文件信息(由于启用了OMF,主备库的数据文件名是不一致的),所以,需要使用3.5步中收集的数据文件信息来编辑下面脚本中catalog datafilecopy后面的信息,将备库数据文件路径和名称注册到新的控制文件中。

当主库与备库的数据文件存储方式为ASM, 并且ASM管理数据文件名称的机制为OMF时, 会导致主备库的文件名称不一致。

 

  •  
  •  
......catalog datafilecopy'+DATA/xxxxxxx/datafile/ *******.dbf;

 

8)备库使用set newname 命令修改数据文件路径

 

如果不使用catalog datafilecopy 命令扫描数据文件,直接set newname命令会报如下错误:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
using target database control file instead of recovery catalogRMAN-00571: ===========================================================RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============RMAN-00571: ===========================================================RMAN-03002: failure of switch command at 08/23/2017 21:27:12RMAN-20230: datafile copy not found in the repositoryRMAN-06015: error while looking up datafile copy name: +DATA/xxxxxxx/datafile/*******.dbf

 

使用set newname命令:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
rman target /run {set newname for datafile          1 to '+DATA/xxxxxxx/datafile/*******.dbf;                             set newname for datafile          2 to '+DATA/xxxxxxx/datafile/*******.dbf';                             set newname for datafile          3 to '+DATA/xxxxxxx/datafile/*******.dbf';                             set newname for datafile          4 to '+DATA/xxxxxxx/datafile/*******.dbf';                             ......
set newname for datafile        150 to '+DATA/xxxxxxx/datafile/*******.dbf’;   switch datafile all;    }                  

 

备库开启同步机制:

 

  •  
SQL>  ALTER DATABASE recover managed standby DATABASE disconnect FROM SESSION;

 

备库alert警告日志报找不到151、152、153、154、155号数据文件

 

9)主库备份缺失的数据文件

 

在主库备份151、152、153、154、155号数据文件:

 

  •  
  •  
$ rman target /RMAN> backup datafile 151,152,153,154,155;

 

把备份集复制到备库

 

  •  
scp datafile_151.dbf 16.1.14.201: /oradata

 

10)备库恢复新增加的数据文件

 

备库恢复151,152,153,154,155号数据文件:

 

  •  
  •  
  •  
$ rman target /RMAN> CATALOG START WITH '/oradata';RMAN> restore datafile 151,152,153,154,155;

 

11)开启DG同步机制

 

备库开启恢复:

 

  •  
SQL> ALTER DATABASE recover managed standby DATABASE using current logfile disconnect FROM SESSION;

 

小结

 

Oracle datagurad是Oracle数据库最常用构建灾备数据库的手段,建议多从运维角度定期检查DataGuard的运行情况。此外在删除备机归档等非常规操作时,应确认dataguard的相关状态,以避免产生Gap导致的一系列问题。

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告