<p>备库需先停MRP并取最小checkpoint_change# SCN,而非CURRENT_SCN;主库增量备份必须显式指定FROM SCN;备库恢复前须catalog备份、重建standby控制文件、手动set newname适配路径,并补全tempfile和standby logfile。</p>

备库停MRP并取最小SCN,别用CURRENT_SCN
备库必须先停掉日志应用,否则RMAN恢复会报错ORA-01153。执行:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
取SCN时,CURRENT_SCN看起来最“新”,但实际不可靠——它只反映控制文件状态,而某些数据文件头可能已滞后。真正该用的是:SELECT MIN(CHECKPOINT_CHANGE#) FROM V$DATAFILE_HEADER;
- 这个值代表所有数据文件中最老的检查点SCN,是能保证所有块都一致的下界
- 如果备库有只读表空间(如临时undo),要排除:
WHERE FILE# NOT IN (SELECT FILE# FROM V$DATAFILE WHERE ENABLED = 'READ ONLY') - RAC环境还要注意thread一致性,多实例下
MIN(fhscn)需关联x$kcvfh和v$datafile联合查
主库RMAN增量备份必须带FROM SCN,不能只靠tag
命令必须显式指定起始SCN,否则RMAN默认从上次全备开始,可能漏掉关键变更。正确写法:BACKUP INCREMENTAL FROM SCN 75039049863 DATABASE FORMAT '/tmp/ForStandby_%U' TAG 'FORSTANDBY';
常见错误是只写BACKUP INCREMENTAL DATABASE,结果备份范围不对,恢复时RMAN-06025报找不到归档或备份片。
- 若主库比备库多了datafile(比如新增了表空间),要单独备份:
BACKUP DATAFILE 60,61 FORMAT '/tmp/datafile_%U.bak' TAG 'datafile'; - 加
AS COMPRESSED BACKUPSET能减小传输体积,但会增加主库CPU压力,大库建议启用 - 别忘了同步备份standby控制文件:
BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/tmp/ForStandbyCTRL.bck';
备库恢复前必须catalog,且controlfile restore顺序不能错
备份传到备库后,第一步不是RESTORE,而是让控制文件“认出”这些备份片:CATALOG START WITH '/tmp/ForStandby';。没这步,RECOVER DATABASE NOREDO会提示RMAN-06023: no backup or copy of datafile found。
控制文件恢复必须在数据库MOUNT状态下完成,且顺序固定:
-
SHUTDOWN IMMEDIATE→STARTUP NOMOUNT RESTORE STANDBY CONTROLFILE FROM '/tmp/ForStandbyCTRL.bck';-
ALTER DATABASE MOUNT;(此时控制文件已加载,但路径仍指向主库) - 接着
CATALOG,再RECOVER DATABASE NOREDO
如果先RESTORE DATABASE再换控制文件,RMAN会按旧控制文件路径去找datafile,大概率报ORA-01119或ORA-27037。
datafile路径不一致必须set newname,不能依赖自动映射
主库控制文件里的datafile路径(比如/u01/oradata/PROD/system01.dbf)在备库几乎肯定不存在。RMAN不会自动适配,必须人工干预。
两种方式选其一:
- 对单个文件:在
RUN块里SET NEWNAME FOR DATAFILE 5 TO '+DATA';,然后RESTORE DATAFILE 5; - 批量重定向:用
SWITCH DATABASE TO COPY;(前提是已RESTORE过),或提前配置CONFIGURE AUXNAME FOR DATAFILE 5 TO '+DATA';
最容易被忽略的是tempfile和redo log——它们不参与RMAN恢复,但控制文件重建后,备库启动可能卡在ORA-01157。得手工ALTER DATABASE CREATE TEMPFILE和ALTER DATABASE ADD STANDBY LOGFILE补全。


















