应查v$datafile_header中min(checkpoint_change#)作为安全scn起点,而非current_scn;备份需用backup incremental from scn并配tag;备库恢复前须还原控制文件、catalog备份集、set newname,并验证无归档缺口及mrp0状态正常。
怎么选scn:别直接用 current_scn,看 v$datafile_header
备库数据不一致时,current_scn 只是控制文件记录的值,而真实落盘的最小scn在数据文件头里。如果只按 current_scn 做增量备份,可能漏掉部分文件的变更,导致恢复后仍报 ora-01157 或文件头scn回退。
- 必须查
select min(checkpoint_change#) from v$datafile_header,这个才是安全起点 - 若结果与
CURRENT_SCN相差很大(比如 > 100万),说明有数据文件长期没 checkpoint,要单独处理这些文件 - 主库执行备份前,务必确认该 SCN 在主库归档范围内(
select * from v$archived_log where first_change# and next_change# > <scn></scn>)
BACKUP INCREMENTAL FROM SCN 的实际写法和常见错
命令本身简单,但参数错一个就白跑。Oracle 11g 不支持 INCREMENTAL LEVEL 1 直接作用于备库修复场景,必须用 FROM SCN。
- 正确写法:
BACKUP INCREMENTAL FROM SCN 12345678 DATABASE FORMAT '/rman/inc_%U' TAG 'FORSTANDBY' - 错误写法:
BACKUP INCREMENTAL LEVEL 1 DATABASE—— 这会基于上次 level 0,跟备库当前状态无关 - 别漏
TAG,后续在备库CATALOG时靠它快速定位备份集 - 如果主库开了 RAC,建议加
ALLOCATE CHANNEL并指定MAXPIECESIZE,避免单个备份片过大传输失败
备库恢复时 RECOVER DATABASE NOREDO 之前必须做三件事
很多人卡在 RECOVER DATABASE NOREDO 报错,其实不是命令问题,而是前置动作没到位。
- 先
SHUTDOWN IMMEDIATE,再STARTUP NOMOUNT,然后RESTORE STANDBY CONTROLFILE—— 控制文件必须来自主库最新备份,不能复用旧的 -
CATALOG START WITH '/path/to/backup'必须在MOUNT状态下执行,且路径要精确到含备份文件的父目录,不能只写到 /rman - 如果主备文件路径不一致(比如主库在 +DATA,备库在 /oradata),必须提前
SET NEWNAME FOR DATAFILE,否则RESTORE会尝试写到不存在的 ASM diskgroup 路径上
恢复完别急着开 MRP,先验证 v$archive_gap 和 v$managed_standby
执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT 前,得确认底层块级已对齐,否则 MRP 一启动就报 GAP 或 stuck。
- 查
SELECT * FROM V$ARCHIVE_GAP,结果应为空;若有 gap,说明增量备份没覆盖全部缺失范围 - 查
SELECT PROCESS, STATUS, CLIENT_PROCESS, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY,确保MRP0是APPLYING_LOG,且CLIENT_PROCESS是LGWR或ARCH - 真正容易被忽略的是:恢复后首次应用日志时,
RECOVER DATABASE NOREDO不会自动清理旧的 online redo log,得手动ALTER DATABASE CLEAR LOGFILE GROUP 1等,否则可能卡在 “waiting for archive log”











