19c修复gap应优先使用recover standby database from service:它可在备库open或mount状态下在线执行,依赖主库数据文件中仍保留的变更块和双向可解析的服务名;若v$archive_gap非空且主库对应归档已删但数据块未被覆盖,则属可网络修复场景,否则需退回传统增量备份。
直接说结论:19c 修复 gap,优先用 recover standby database from service,而不是传统增量备份。后者要停库、换控制文件、手动传文件、易出 ora-01152,而前者可在 open 状态下在线完成,只要主备网络通、服务名配对、归档虽丢但数据文件没损坏。
怎么确认 Gap 是“可网络修复”还是必须走传统增量?
先别急着连 RMAN。Gap 能否用 FROM SERVICE 修复,取决于两个硬条件:
- 主库归档日志虽丢失,但对应时间段内的数据块变更仍保留在主库数据文件中(即未被覆盖或收缩)——这是前提;
- 备库当前处于
MOUNT或OPEN READ ONLY状态,且DB_UNIQUE_NAME和主库的tnsnames.ora中的服务名能双向解析(tnsping primary_db在备库上必须通)。
如果备库报 ORA-16055 且 V$ARCHIVE_GAP 返回非空,但主库 ARCHIVE LOG LIST 显示对应序列已删除,就属于典型“可网络修复”场景;若备库还卡在 NOMOUNT、或主库刚做过大表 truncate+shrink space 导致旧块物理清除,则必须退回传统增量流程。
RMAN 中执行 RECOVER STANDBY DATABASE FROM SERVICE 的关键步骤
这个命令不是“一键修复”,它背后会触发主库生成压缩备份集、网络传输、备库自动注册并应用——每步都可能卡住:
- 必须在备库的 RMAN 中执行,目标数据库为
target /(即本机),FROM SERVICE指向主库服务名(如primary_db),不能反向; - 执行前确保备库已
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;,否则会冲突报ORA-16136; - 加
USING COMPRESSED BACKUPSET可显著减少传输量,但主库需有足够DB_RECOVERY_FILE_DEST空间临时存备份集; - 若主库是 RAC,命令会自动跨实例协调,无需指定实例;但备库如果是 RAC,必须所有节点都停 MRP,且只在一个节点执行该 RMAN 命令。
示例命令:
RMAN> RECOVER STANDBY DATABASE FROM SERVICE primary_db USING COMPRESSED BACKUPSET;
为什么传统增量备份在 19c 容易失败?常见坑点
即使你决定用老办法,19c 的某些默认行为会让传统流程更脆弱:
-
BACKUP INCREMENTAL FROM SCN的 SCN 必须取自备库V$DATABASE.CHECKPOINT_CHANGE#,取CURRENT_SCN会导致跳过部分已写入但未 checkpoint 的块,恢复后报ORA-19909; - 19c 默认启用
ENABLE_PLUGGABLE_DATABASE=TRUE,增量备份若没加PLUGGABLE DATABASE子句,可能漏掉 PDB 数据文件; - 恢复后执行
RECOVER DATABASE NOREDO前,必须先RESTORE STANDBY CONTROLFILE并STARTUP MOUNT,否则控制文件里记录的RESETLOGS_ID和实际数据文件头不匹配,直接报ORA-01110; - 别信 “备份完 scp 就行”——19c 的备份片默认带加密标识(哪怕没显式配置),若主备
ENCRYPTION KEY不一致,备库 RMAN 会静默跳过该备份片,LIST BACKUP看得见,RECOVER却不用。
真正耗时的从来不是命令本身,而是确认 SCN 是否准确、服务名是否真通、控制文件是否被旧备份污染——这些地方错一点,整个流程就得重来两小时。











