合 在DG环境中,主库丢失归档,对主库进行基于SCN的增量备份来恢复物理DG环境
面试DBA岗位,面试官对于DG环境常常会问到,若是主库丢失了归档文件,而这些归档文件还未来得及传递到备库,则物理备库是否只能通过重建的方式来恢复呢?这道面试题是作者亲身经历,当时以为只能重建备库,但最后经过查找文档找到了解决办法,可以通过对主库进行基于SCN的增量备份来恢复物理DG。
全过程简单有如下几个步骤:
第一步,主库创建基于SCN的增量备份:
首先要知道误删除或者丢失的归档日志是从哪个SCN开始的。视图V$ARCHIVED_LOG的FIRST_CHANGE#列能够查到归档日志对应的起始SCN。可以使用如下SQL查询最小的SCN:
1 2 3 4 5 6 7 | SELECT (SELECT MIN(D.CHECKPOINT_CHANGE#) FROM V$DATAFILE D) DATAFILE_SCN, (SELECT MIN(D.CHECKPOINT_CHANGE#) FROM V$DATAFILE_HEADER D WHERE ROWNUM = 1) DATAFILE_HEADER_SCN, (SELECT CURRENT_SCN FROM V$DATABASE) CURRENT_SCN, (SELECT MIN(B.NEXT_CHANGE#) FROM V$ARCHIVED_LOG B WHERE B.SEQUENCE# IN (968,644)--这里修改成丢失的归档号 AND RESETLOGS_CHANGE# =(SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)) NEXT_CHANGE# FROM DUAL; |
若最小的SCN为750983,则在主库上使用BACKUP ... INCREMENTAL FROM SCN为主库做一个增量备份,这个操作会将整个库中SCN大于750983的BLOCK全备份出来,SQL如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 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;--找到控制文件的备份集文件名 |
第二步,将备份的文件复制到备库端的空目录下
第三步,恢复备库的控制文件
在使用RMAN恢复备库的控制文件之前,需要将原来的控制文件进行手工的冷备并且记录下原来的控制文件中记录的数据文件的名称:
1 2 3 4 5 | SELECT ''''||NAME||''' ;' FROM V$DATAFILE; --记录备库数据文件原名称及路径 startup force nomount cp +DATA/oranlhr/controlfile/control01.ctl +DATA/oranlhr/controlfile/control01.ctl_bk restore standby controlfile from '/home/oracle/bak/standby_TESTDG_20180525_19t3q9sb_1_1.bak'; select 'alter database rename file '''||NAME ||''' TO ' FROM V$datafile; --查询恢复控制文件后备库数据文件的名称 |