如何处理Data Guard主库执行Flashback Database_备库如何跟随主库闪回到历史SCN


Flashback Database后备库报ORA-16705或MRP卡住,因主库闪回进入新incarnation而备库仍处旧incarnation,须在备库MOUNT状态下执行FLASHBACK DATABASE TO INCARNATION并确保控制文件最新、有足够flashback log。

Flashback Database 后备库为什么报 ORA-16705 或 MRP stuck

主库执行 flashback database 回退到历史 scn,备库不会自动跟随——它仍按原有日志流重做,而主库闪回后生成的新归档与备库当前的 scn 不连续,mrp 进程会因找不到对应日志或校验失败停摆,典型错误是 ora-16705: the value of the property is invalid(实际常伴随 ora-19909: datafile belongs to a different incarnation)。

  • 根本原因是:闪回让主库进入新控制文件 **incarnation**,但备库仍活在旧 incarnation 里,两者“不认亲”
  • 必须手动把备库也切换到主库当前的 incarnation,否则任何恢复操作都绕不开这个坎
  • 别指望 RECOVER MANAGED STANDBY DATABASE 自动感知——它只管日志连续性,不管 incarnation 对齐

如何查主库当前 incarnation 并同步到备库

先确认主库当前 incarnation ID 和 SCN,再让备库“认祖归宗”。这步漏掉或 ID 输错,后续全白忙。

  • 在主库查:SELECT INCARNATION#, RESETLOGS_TIME, STATUS FROM V$DATABASE_INCARNATION ORDER BY RESETLOGS_TIME;,找状态为 CURRENT 的那行,记下 INCARNATION#
  • 在备库停 MRP:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
  • 在备库切换 incarnation:FLASHBACK DATABASE TO INCARNATION <i>主库查到的 INCARNATION#</i>;(注意:不是 SCN,是 incarnation ID)
  • 重启备库到 MOUNT 状态后,再启动 MRP:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

备库执行 FLASHBACK DATABASE TO INCARNATION 的前置条件

这命令看着简单,但缺一个条件就报 ORA-38729: Not enough flashback database log data to do flashback 或直接拒绝执行。

  • 备库必须处于 MOUNT 状态(不能 OPEN,也不能 NOMOUNT)
  • 备库控制文件必须是**从主库最新备份或通过 ALTER DATABASE CREATE STANDBY CONTROLFILE 重建过**的——老控制文件不认识新 incarnation
  • DB_RECOVERY_FILE_DEST 下要有足够 flashback logs(即使备库没开 flashback database,也要有日志存留,因为 TO INCARNATION 依赖这些元数据)
  • 如果备库之前被 open read-only 过,得先 SHUTDOWN IMMEDIATE + STARTUP MOUNT,否则命令无效

闪回后验证备库是否真正跟上主库

MRP 恢复不报错 ≠ 数据已对齐。常见假象是 MRP 显示“applying”,但 APPLIED_SCN 卡在闪回前,说明还在重做旧日志。

  • 查备库实时同步点:SELECT MAX(SEQUENCE#), APPLIED_SCN FROM V$ARCHIVED_LOG WHERE APPLIED='YES';,对比主库当前 CURRENT_SCN
  • 看 MRP 进程状态:SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY WHERE PROCESS='MRP0';STATUS 必须是 APPLYING_LOG,且 SEQUENCE# 应持续增长
  • 最硬核验证:在主库执行 ALTER SYSTEM ARCHIVE LOG CURRENT;,几秒后检查备库 V$ARCHIVED_LOG 是否多出一条刚归档、且 APPLIED='YES' 的记录

incarnation 对齐是单点强依赖,一旦错配,所有后续日志应用都会失效;很多人卡在以为“启动了 MRP 就万事大吉”,其实第一步没走对,后面全是空转。