记录一起由于DG主备库之间出现GAP,归档日志丢失,导致备库无法应用日志同步的故障。
通常有GAP可以通过fal,或者手工将日志拷贝到备库方式解决,但是这次gap的日志在主库已经彻底丢失。
参考MOS: Steps to perform for Rolling Forward a Physical Standby Database using RMAN Incremental Backup. (Doc ID 836986.1)
一、操作步骤
1.关闭MRP进程
代码语言:javascript复制--操作完可以查看v$managed_standby视图确定是否关闭
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
2.确定备库scn
这是为了确定增量备份从哪个scn开始,需要查询两个地方,找到’lowest SCN’,哪个结果最小,就从哪个开始。
代码语言:javascript复制--这里就延伸出一个问题,为啥要查询两个地方呢?
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
SQL> select min(checkpoint_change#) from v$datafile_header
where file# not in (select file# from v$datafile where enabled = 'READ ONLY');
3.主库增量备份
主库登陆RMAN
代码语言:javascript复制RMAN> BACKUP INCREMENTAL FROM SCN 3162298 DATABASE FORMAT '/tmp/ForStandby_%U' tag 'FORSTANDBY';
4.备份集传到备库
我这边主备库之间都挂了nas,没有nas的话scp传输
5.在备库rman中注册增量备份
注册进备库的控制文件中
代码语言:javascript复制RMAN> CATALOG START WITH '/tmp/ForStandby';
6.应用增量
备库需要在mount状态下
代码语言:javascript复制RMAN> RECOVER DATABASE NOREDO;
NOREDO意思就是不应用重做日志,仅应用增量备份,思考一下为什么不应用呢?
7.备份主库控制文件,并传输到备库
代码语言:javascript复制RMAN> BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/tmp/ForStandbyCTRL.bck';
8.记录备库数据文件的信息
备库的控制文件会被上一步备份出来的控制文件刷新,主库的数据文件名称可能会跟备库不一样,所以存一份参考
代码语言:javascript复制spool standby_datafile_names.txt
set pagesize 1000;
set lines 200
col name format a60
select file#, name from v$datafile order by file# ;
spool off
9.备库恢复standby control file,并启动数据库到mount状态
代码语言:javascript复制RMAN> SHUTDOWN IMMEDIATE ;
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE STANDBY CONTROLFILE FROM '/tmp/ForStandbyCTRL.bck';
RMAN> ALTER DATABASE MOUNT;
10.处理主备库数据文件位置不同的问题(坑)
这里被坑了一把,一开始网上随便搜索的几篇教程,都没有提到这一步,导致我执行完上一步,想打开数据库就报错,没截图,但是报错内容就是找不到数据文件巴拉巴拉,提示的路径就是主库数据文件的路径。心想玩坏了,赶紧按下面的方式查了下:
- select * from v$dbfile; 视图里显示的是主库数据文件的路径,想想也是刚从主库恢复了控制文件
- asm中查询实际备库物理文件的位置;
- 回看刚才RECOVER DATABASE的日志,是恢复的正确备库路径;
最后还是官方文档靠谱,下面是正确的处理方式:
代码语言:javascript复制Note: We recommend checking the incarnation for primary and standby before completing this step.
--incarnation 是个啥?参考:https://www.cnblogs.com/bicewow/p/11205685.html
example: RMAN> list incarnation;
由于控制文件是从主库恢复过来的的,因此这个恢复的 STANDBY 控制文件中的数据文件位置名称将与主库数据库的数据文件位置名称相同。
如果备库和主库之间的目录结构不同,或者如果使用OMF,要在rman中使用catalog命令执行一个重命名操作。
如果主备具有相同的结构和数据文件名称,则可以跳过此步骤。
对备用数据文件所在的每个磁盘组(或目录)在STANDBY 中执行下面步骤:
代码语言:javascript复制RMAN> CATALOG START WITH ' DATA/STBY/datafile/';
如果在备份的SCN号之后,主库增加了数据文件,那么standby_file_management参数设置auto也没用。新添加的数据文件必须restored到备用服务器。这个可以参考:Note:1531031.1
代码语言:javascript复制--主库查一下这个scn号之后有没有新加数据文件
SQL>SELECT FILE#, NAME FROM V$DATAFILE WHERE CREATION_CHANGE# > 3162298
代码语言:javascript复制--没有就继续执行这个操作
RMAN> SWITCH DATABASE TO COPY;
datafile 1 switched to datafile copy " DATA/STBY/datafile/system.297.688213333"
datafile 2 switched to datafile copy " DATA/STBY/datafile/undotbs1.268.688213335"
datafile 3 switched to datafile copy " DATA/STBY/datafile/sysaux.267.688213333"
--要是上面copy有报错RMAN-06571,就得挨个执行
RMAN> switch datafile <number> to copy;
For example:
RMAN> switch datafile 5 to copy;
- 到这里可以再执行一下第八步的操作,对比一下两次的结果
- 这时候再次查询一下备库scn号,看看前滚有没有成功
11.配置备库使用闪回(可选)
代码语言:javascript复制--备库配置闪回的意义是什么?
SQL> ALTER DATABASE FLASHBACK OFF;
SQL> ALTER DATABASE FLASHBACK ON;
12.清空所有standby redo log groups
为啥要清空呢?
代码语言:javascript复制SQL> select GROUP# from v$logfile where TYPE='STANDBY' group by GROUP#;
代码语言:javascript复制SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 2;
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 3;
....
13.启动mrp进程
启动后主库切换日志,看看备库是否同步
代码语言:javascript复制SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
二、总结
一些异常及过程,记得截图,要不故障报告不好写,笔记也有缺失,另外还是官方文档、MOS靠谱些
需要再想想的问题:
- 确定最小scn的时候为什么要查询vdatabase和vdatafile_header两处
- RECOVER DATABASE 为什么要加 NOREDO
- 备库配置闪回的意义是什么
- 为何要清空 standby redo log groups