首页 » ORACLE, ORACLE [C]系列 » How to Recover Oracle Standby Database Using an Incremental Backup?

How to Recover Oracle Standby Database Using an Incremental Backup?

Oracle Standby database容灾库有时因为一些原因缺少了Primary database的archivelog未应用而中断同步,如备库归档目录使用率100%,或主库未传输删除了归档等。重新搭建DATAGUARD对于较大的数据库可能是费时费力,通常可以采用增量备份的方式,最近刚好是在处理一个ogg不同步的问题时,发现OGG不报错也不抽取及时跟到standby有的归档开始,后来发现OGG是从ADG 抽取,使用的DBLOGREADER模式,在standby apply后才能抽取,而STANDBY 缺少了中间一个archivelog,,网上的类似的文档很多,步骤挺多,简单记录一下。

对于有备份归档的当然可以使用从备份恢复归档的方式解决,如果归档又无备份时可以采用下面的方法:

在备用数据库上检查当前的 SCN

SQL> select current_scn from v$database
CURRENT_SCN
-----------
 6814738497

SQL> select min(checkpoint_change#) from v$datafile_header
where file# not in (select file# from v$datafile where enabled = 'READ ONLY');  2  

MIN(CHECKPOINT_CHANGE#)
-----------------------

SQL> r
  1  select min(checkpoint_change#) from v$datafile_header
  2* where file# not in (select file# from v$datafile where enabled = 'READ ONLY')

MIN(CHECKPOINT_CHANGE#)
-----------------------


SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
	6814738498
	6814738498
	6814738498
...
22 rows selected.

Note:
最上面两个查询中最小的,本case为6814738497

在主数据库上做增量备份从上面的SCN开始

SQL> select sum(bytes)/1024/1024/1024 gb from v$datafile;
	GB
----------
580.152313

RMAN>
run{
allocate channel c1 device type disk;
BACKUP as compressed backupset INCREMENTAL FROM SCN 6814738497 DATABASE FORMAT '/u01/ForStandby_%U' tag 'FORSTANDBY';
release channel c1;
}

Note:
查看库大小,如果本地磁盘空间不足,可以使用压线备份,可以节约大量的本地空间需求,但是时间相对更长。

在主数据库查看备份进度

select start_time,input_bytes,output_bytes,input_bytes_per_sec_display from v$rman_backup_job_details where status!='COMPLETED';

Note:
可以从input_bytes查看已读了数据库的多少,判断进度。

在主数据库备份standby control文件

run{
allocate channel c1 device type disk;
BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/u01/ForStandbyCTRL.bck';
release channel c1;
}

传输主库的以上的增量备份和standby 控制文件到备库

scp ForStandby* 192.168.xxx.xxx:/home/oracle/bak/dgbackup

在备库停止STANDBY的RECOVER进程

SQL> alter database recover managed standby database;

在备库上注册上面的备份到standby数据库

$ rman target /
RMAN> catalog start with '/home/oracle/bak/dgbackup';

using target database control file instead of recovery catalog
searching for all files that match the pattern /home/oracle/bak/dgbackup

List of Files Unknown to the Database
=====================================
File Name: /home/oracle/bak/dgbackup/ForStandbyCTRL.bck
File Name: /home/oracle/bak/dgbackup/ForStandby_kk0rh7v8_1_1
File Name: /home/oracle/bak/dgbackup/ForStandby_kl0rhbe2_1_1

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

List of Cataloged Files
=======================
File Name: /home/oracle/bak/dgbackup/ForStandbyCTRL.bck
File Name: /home/oracle/bak/dgbackup/ForStandby_kk0rh7v8_1_1
File Name: /home/oracle/bak/dgbackup/ForStandby_kl0rhbe2_1_1

在本库应用增量备份

shu immediate

startup mount 

RMAN>
run{
allocate channel c1 device type disk;
RECOVER DATABASE NOREDO; 
release channel c1;
}

在主库和备库检查 incarnation

RMAN> list incarnation;

Note:
应该结果是一样的

检查主库和备库的文件名

SELECT FILE#, NAME FROM V$DATAFILE;

检查主库备份后是否有增加新文件

SQL> SELECT FILE#, NAME FROM V$DATAFILE WHERE CREATION_CHANGE# > 6814738497;
no rows selected

如果有文件可以单独备份还原文件

RMAN> backup datafile #, #, #, # format '/tmp/ForStandby_%U' tag 'FORSTANDBY';

run
{
set newname for datafile X to '+DISKGROUP';
set newname for datafile Y to '+DISKGROUP';
set newname for datafile Z to '+DISKGROUP';
etc.
restore datafile x,y,z,....;
}

在备库恢复standby controlfile

RMAN> SHUTDOWN IMMEDIATE ;
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE STANDBY CONTROLFILE FROM '/tmp/ForStandbyCTRL.bck';

Note:
如果不重建或重新恢复standby控制文件,虽然数据文件头SCN已更新,但是控制文件中(v$dtafile)的scn未更新,还是会等备份前的归档,而无法继续应用。

在备库更新控制文件中数据文件名

-- 如果主库和备库路径一样,这一步可以跳过,如果主库和备库文件名不一致,因为恢复了备库的控制文件是从主库备份的,控制文件记录的文件名不是备份的实际路径,需要更名
SQL>alter database mount

RMAN>  catalog start with '/home/oradata/DB11GSTD/'

RMAN>  SWITCH DATABASE TO COPY; 

Note:
我这里是因为主库是ASM,备库是本地文件系统,所以需要更名,注意要注册所有的文件路径。

更改备库的flashback database功能(可选)

SQL> ALTER DATABASE FLASHBACK OFF; 
SQL> ALTER DATABASE FLASHBACK ON;

在备库清理standby 和redo logfile

SQL> begin
for log_cur in ( select group# group_no from v$log )
loop
execute immediate 'alter database clear logfile group '||log_cur.group_no;
end loop;
end;
/

SQL> begin
for log_cur in ( select group# group_no from v$standby_log )
loop
execute immediate 'alter database clear logfile group '||log_cur.group_no;
end loop;
end;
/

Note:
如果不清理db alert会提示文件不存在,这里oracle有一点比较强的是,不用rename ,直接clear会在alert中提示无法联系ASM diskgroup,而自动改成了本地文件系统的路径。

在备库启动日志应用MRP

SQL> alter database recover managed standby database using current logfile disconnect from session;

检查主库和备库的SCN

SQL> select current_scn from v$database; 

以上11G环境就基本做完了, 从18c起可以一条命令自动完成以上工作,从12c提供了一种from service的方法, 如18c或19c中,使用一个到主库的service,从备库执行:

RMAN> RECOVER STANDBY DATABASE FROM SERVICE PRM180;

More about:
For 11g
11g Steps to perform for Rolling Forward a Physical Standby Database using RMAN Incremental Backup. (Doc ID 836986.1)

For 12.1 and 12.2, see the following procedure:
12c How to Roll Forward a Standby Database Using Recover Database From Service (Doc ID 2850185.1)

For 18c and higher, see the following procedure:
Roll Forward Physical Standby Using RMAN Incremental Backup in Single Command (Doc ID 2431311.1)

打赏

,

对不起,这篇文章暂时关闭评论。