必须先确认归档是否丢失:备库查V$ARCHIVE_GAP得缺口范围,主库查V$ARCHIVED_LOG确认文件是否存在;存在则scp+REGISTER LOGFILE,否则需取最小SCN做增量备份并重建控制文件。

能修,但必须先确认归档是否真的丢失——如果主库还有缺失的归档,直接拷贝注册比增量备份快得多,也更安全。
查 GAP 范围和归档是否存在
备库上执行 SELECT * FROM V$ARCHIVE_GAP;,拿到 LOW_SEQUENCE# 和 HIGH_SEQUENCE#。这是最关键的起点,别跳过。
然后立刻去主库查这些序列的归档还在不在:
-
SELECT NAME, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG WHERE SEQUENCE# BETWEEN 183 AND 185;(把 183/185 换成你查到的实际值) - 如果返回为空,或
NAME是 NULL / 路径不可达,说明归档确实被删了,才需要走增量备份 - 如果归档存在,直接
scp到备库对应目录,再ALTER DATABASE REGISTER PHYSICAL LOGFILE '...';注册即可,5 分钟内恢复
取备库最小有效 SCN
增量备份必须从一个“所有数据文件都一致认可”的 SCN 开始,不能只用 CURRENT_SCN。要取三个值里的最小值:
SELECT CURRENT_SCN FROM V$DATABASE;SELECT MIN(FHSCN) FROM X$KCVFH;SELECT MIN(F.FHSCN) FROM X$KCVFH F, V$DATAFILE D WHERE F.HXFIL = D.FILE# AND D.ENABLED != 'READ ONLY';
注意:如果备库是 RAC,且某些数据文件处于 READ ONLY 状态(比如只读表空间),第三个查询会排除它们,避免误用旧 SCN 导致恢复失败。
RMAN 增量备份与恢复的关键操作
主库执行备份时,BACKUP INCREMENTAL FROM SCN 是核心命令,但有几点容易错:
- 不要加
PLUS ARCHIVELOG—— 增量备份只同步数据块变化,不处理归档;归档 GAP 已经确认丢失,补它没意义 - 格式路径必须在备库有写权限,且磁盘空间充足;
FORMAT '/backup/incr_%U'中的%U会自动生成唯一名,别手写固定名 - 备份完成后,立刻在主库生成 standby 控制文件:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl';,这步不能省——旧控制文件里可能还记着已丢失的日志序列,会导致后续恢复报错 - 备库恢复前必须先
SHUTDOWN IMMEDIATE→STARTUP NOMOUNT→RMAN TARGET / RESTORE CONTROLFILE FROM '/tmp/standby.ctl'→ALTER DATABASE MOUNT
恢复后必须检查新增数据文件
主库在 GAP 期间如果新增了数据文件,备库不会自动创建,增量备份也不会包含它的结构信息。漏掉这个,RECOVER DATABASE NOREDO 会卡在 “datafile not found” 错误上。
检查方法:
- 主库执行:
SELECT FILE#, NAME FROM V$DATAFILE WHERE CREATION_CHANGE# >=; - 如果返回非空,记录这些
FILE#和NAME,在备库上手动添加:ALTER DATABASE CREATE DATAFILEAS ' '; - 路径要和备库实际布局一致;如果主备目录结构不同,提前在备库设好
STANDBY_FILE_MANAGEMENT=MANUAL
最后一步 RECOVER DATABASE NOREDO 成功不代表完事——必须再切几次主库日志、确认备库 V$MANAGED_STANDBY 中 MRP0 进程状态变成 APPLYING_LOG,且 V$ARCHIVE_GAP 返回空集,才算真正闭环。











