必须取备库current_scn、min(fhscn)及min(f.fhscn)三者最小值作为增量起点,且必须用主库新建的standby控制文件替换备库旧控制文件,否则恢复后因scn不一致触发ora-01122/ora-01207报错。

能解决,但必须用备库当前最小 SCN 作为起点做主库增量备份,且控制文件必须重建 —— 否则恢复后数据文件头和控制文件 SCN 不一致,启动报错 ORA-01122 / ORA-01207。
怎么查备库真正可用的最小 SCN
别只看 CURRENT_SCN。它可能比数据文件头的 checkpoint SCN 高,而 RMAN 增量恢复依赖的是数据文件头的一致性 SCN。实际应取三个值中的最小值:
SELECT CURRENT_SCN FROM V$DATABASESELECT MIN(FHSCN) FROM X$KCVFHSELECT MIN(F.FHSCN) FROM X$KCVFH F, V$DATAFILE D WHERE F.HXFIL = D.FILE# AND D.ENABLED != 'READ ONLY'
如果备库处于 OPEN 状态且有只读表空间,第三个查询更可靠;若查出来为空或报错,需先 SHUTDOWN IMMEDIATE 再 STARTUP MOUNT 后重试。
主库增量备份命令和关键参数
备份必须指定 FROM SCN,且格式路径要有写权限、磁盘空间充足。常见错误是漏掉 NOFILENAMECHECK(当备库数据文件路径与主库不一致时)或误用 AS BACKUPSET(11g 默认就是 backupset,不用显式写):
RMAN> BACKUP INCREMENTAL FROM SCN 570778 DATABASE
FORMAT '/u01/rman/incre_%U'
TAG 'FORSTANDBY';
多通道可加速,但注意并行度别超过 CPU 核数 × 2:
ALLOCATE CHANNEL c1 TYPE DISKALLOCATE CHANNEL c2 TYPE DISK
备份过程中用这个查进度:
SELECT INST_ID, SID, SERIAL#, OPNAME, ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" FROM GV$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN%' AND TOTALWORK != 0 AND SOFAR TOTALWORK;
备库恢复前必须换控制文件
这是最容易被跳过的致命步骤。旧控制文件里记录的是 GAP 前的检查点信息,直接恢复增量会导致控制文件和数据文件头 SCN 冲突:
- 主库执行:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl' - scp 到备库相同路径,确保属主是
oracle、权限 644 - 备库停库:
SHUTDOWN IMMEDIATE→STARTUP NOMOUNT - RMAN 恢复控制文件:
RESTORE CONTROLFILE FROM '/tmp/standby.ctl' ALTER DATABASE MOUNT
之后再注册备份片、执行 RECOVER DATABASE NOREDO。如果跳过这步,RECOVER 表面成功,但一 ALTER DATABASE OPEN RESETLOGS 就报 ORA-01122。
恢复后验证和重启应用的细节
恢复完成后不要直接开库。先确认:
- 所有数据文件状态为
ONLINE:SELECT NAME, STATUS FROM V$DATAFILE - 检查是否有隐含坏块:
VALIDATE DATABASE(可选,耗时) - 确认归档传输已启用:
SHOW PARAMETER log_archive_dest_state_2应为ENABLE
最后启动日志应用:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
注意加 USING CURRENT LOGFILE,否则可能卡在旧日志序列。MRP 进程起来后,立刻查 V$MANAGED_STANDBY 确认 PROCESS = 'MRP0' 且 STATUS = 'APPLYING_LOG'。
整个过程最脆弱的环节不是备份或恢复,而是控制文件切换时机和权限归属 —— scp 过去的 .ctl 文件如果属主不对,RESTORE CONTROLFILE 会静默失败,后续所有操作都白忙。











