在Oracle中,如果主库丢失归档文件,那么物理DG如何恢复?
♣ 答案部分
面试DBA岗位,面试官对于DG环境常常会问到,若是主库丢失了归档文件,而这些归档文件还未来得及传递到备库,则物理备库是否只能通过重建的方式来恢复呢?这道面试题是作者亲身经历,当时以为只能重建备库,但最后经过查找文档找到了解决办法,可以通过对主库进行基于SCN的增量备份来恢复物理DG。
全过程简单有如下几个步骤:
第一步,主库创建基于SCN的增量备份:
首先要知道误删除或者丢失的归档日志是从哪个SCN开始的。视图V$ARCHIVED_LOG的FIRST_CHANGE#列能够查到归档日志对应的起始SCN。可以使用如下SQL查询最小的SCN:
1SELECT (SELECT MIN(D.CHECKPOINT_CHANGE#) FROM V$DATAFILE D) DATAFILE_SCN,
2 (SELECT MIN(D.CHECKPOINT_CHANGE#) FROM V$DATAFILE_HEADER D WHERE ROWNUM = 1) DATAFILE_HEADER_SCN,
3 (SELECT CURRENT_SCN FROM V$DATABASE) CURRENT_SCN,
4 (SELECT MIN(B.NEXT_CHANGE#) FROM V$ARCHIVED_LOG B
5 WHERE B.SEQUENCE# IN (968,644)--这里修改成丢失的归档号
6 AND RESETLOGS_CHANGE# =(SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)) NEXT_CHANGE#
7FROM DUAL;
若最小的SCN为750983,则在主库上使用BACKUP ... INCREMENTAL FROM SCN为主库做一个增量备份,这个操作会将整个库中SCN大于750983的BLOCK全备份出来,SQL如下:
1RUN {
2ALLOCATE CHANNEL D1 TYPE DISK;
3ALLOCATE CHANNEL D2 TYPE DISK;
4ALLOCATE CHANNEL D3 TYPE DISK;
5ALLOCATE CHANNEL D4 TYPE DISK;
6BACKUP 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';
7RELEASE CHANNEL D1;
8RELEASE CHANNEL D2;
9RELEASE CHANNEL D3;
10RELEASE CHANNEL D4;
11}
12list backupset of controlfile;--找到控制文件的备份集文件名
第二步,将备份的文件复制到备库端的空目录下
第三步,恢复备库的控制文件
在使用RMAN恢复备库的控制文件之前,需要将原来的控制文件进行手工的冷备并且记录下原来的控制文件中记录的数据文件的名称:
1SELECT ''''||NAME||''' ;' FROM V$DATAFILE; --记录备库数据文件原名称及路径
2startup force nomount
3cp +DATA/oranlhr/controlfile/control01.ctl +DATA/oranlhr/controlfile/control01.ctl_bk
4restore standby controlfile from '/home/oracle/bak/standby_TESTDG_20180525_19t3q9sb_1_1.bak';
5select 'alter database rename file '''||NAME ||''' TO ' FROM V$datafile; --查询恢复控制文件后备库数据文件的名称
第四步,在备库执行RECOVER操作:
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。