dg库增量修复笔记

来源:这里教程网 时间:2026-03-03 19:49:33 作者:

当dg库rfs进程出现异常,并且dg库需要的归档日志已经在主库删除,如果这个实例的数据不大,那么直接duplicate重做dg即可,如果这个实例数据特别大,那么重做的话可能对主库有影响并且时间比较长,此时如果dg库有查询业务,那么就得需要尽快恢复,所以借助rman结合scn号增量备份和恢复的方式来修复dg库是一个不错的选择。

具体流程如下所示:

一、查看dg库mrp和rfs进程状态

SQL> select process,status,thread#,sequence#,client_pid from v$managed_standby;
二、备库查看gap归档缺失日志序列号
SQL> select * from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE# CON_ID
1 31059 31098 1 2 29227 29264 1
三、查看备库SCN,取最小值
col datafile_scn for 999999999999999
col DATAFILE_HEADER_SCN for 999999999999999
col current_scn for 999999999999999
col next_change# for 999999999999999
select ( select min(d.checkpoint_change#) fromv$datafile d ) datafile_scn ,
( select min(d.checkpoint_change#) fromv$datafile_header d where rownum=1) datafile_header_scn,
(select current_scn from v$database) current_scn,
(select next_change# from v$archived_log where sequence#=148164and resetlogs_change# = (select d.resetlogs_change# from v$database d ) andrownum=1 ) next_change#  from dual;
DATAFILE_SCN DATAFILE_HEADER_SCN CURRENT_SCN NEXT_CHANGE#
-----------------------------------------------------------
70411298484 70411306669 70411306668
SQL> SELECT TO_CHAR(CURRENT_SCN) FROM V$DATABASE;
TO_CHAR(CURRENT_SCN)
70411306668
SQL> SELECT DISTINCT to_char(CHECKPOINT_CHANGE#)FROM V$DATAFILE_HEADER;
TO_CHAR(CHECKPOINT_CHANGE#)
70411306669
四、主库备份出scn之后需要追加的增量数据和控制文件
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
backup as compressed backupset incremental from SCN70411298484 database format '/data/rmanbak/datafile0_%d_%T_%s_%p.BKP' tag 'FORSTANDBY';
backup current controlfile for standby format '/data/rmanbak/controlfile0_%d_%T_%s_%p.BKP';
release channel c1;
release channel c2;
release channel c3;
}
五、将文件传输到待恢复的备库
[oracle@rac01.hkrt.cn:/data/rmanbak]$scp -P22datafile0_SAAS_20240123_2573* 10.192.181.20:/home/oracle/rmanbak/
六、备库重启到nomount状态恢复控制文件
注意一:恢复出来的控制文件记录的数据文件的目录是根据你dg库参数db_file_name_convert转换后的目录。这个控制文件会一直根据你的这个参数变化而变化!所以如果你想修改db_file_name_convert参数,就需要注意了!
注意二:如果你dg库配置了db_create_file_dest参数,那么db_create_file_dest这个参数优先级高于db_file_name_convert,并且db_create_file_dest参数自动创建的文件名字给主库的名字还不一样,这个时候就需要你根据文件的序列号(select  FILE#,name from  v$datafile;) 再在dg库rename下文件名字;
RMAN> restore standby controlfile from'/home/oracle/rmanbak/controlfile0_SAAS_20240123_25738_1.BKP';
七、启动dg库到mount状态
SQL> alter database mount;
八、需要确认此时控制文件中记录的数据文件的目录是不是和dg库真实的路径一致:
restore standby controlfile的时候,会读取db_file_name_convert这个参数的配置来自动映射成dg转换后的路径,但是如果你dg库修改过db_file_name_convert这个参数,那就得特殊处理下!
alter database rename file '/opt/app/oracle/oradata/cux_ep02.dbf'  to  '/opt/app/oracle/archivelog/PSRACDBG/datafile/PSRACDBG/datafile/o1_mf_cux_ep_lx2xxbfy_.dbf';
八、增量恢复dg库
1)告诉控制文件去那个路径去找备份文件
rman target /
catalog start with '/data/backup/ncbackup/'
2)执行恢复操作
run{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
recover database noredo;
release channel c1;
release channel c2;
release channel c3;
}
九、启动dg库mrp进程
SQL> alter database recover managed standbydatabase disconnect from session;
Database altered.
十、关闭dg库mrp进程
SQL> alter database recover managed standbydatabase cancel;
Database altered.
十一、启动dg库到read only open状态
SQL> alter database open read only;
Database altered.
十二、启动mrp即可
SQL> alter database recover managed standbydatabase disconnect from session using current logfile;

相关推荐