做不到零数据丢失,除非主库故障前能mount并执行FLUSH REDO;主库完全不可访问时Failover必然丢失数据,关键在于通过V$ARCHIVE_GAP、V$ARCHIVED_LOG交叉比对控制丢失范围,并严格按FINISH+RESETLOGS完成接管。
做不到零数据丢失,除非主库在故障前还能 mount 并执行 alter system flush redo to。真实场景中,硬件故障往往导致主库完全不可访问,此时 failover 必然伴随数据丢失——关键在于把丢失控制在最小范围。
这是决定能否零丢失的分水岭。只要主库操作系统和存储还能响应,哪怕数据库实例已崩溃,也应优先尝试 mount:
sqlplus / as sysdba 连接主库,执行 STARTUP MOUNT
ALTER SYSTEM FLUSH REDO TO 'standby_db_name'(注意引号和大小写)STARTUP MOUNT 都失败(如 ORA-01078、ORA-27091),直接进入 Failover 流程,接受部分数据丢失V$ARCHIVE_GAP 只显示最高缺口,容易误判“已补全”。实际要交叉比对三处:
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE THREAD# = 1(需在主库 mount 状态下查)V$ARCHIVED_LOG 中 NAME 为空或 DEST_ID 不为 1 的记录APPLIED = 'YES' 的最大序列号:SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED = 'YES' AND THREAD# = 1
RECOVER MANAGED STANDBY DATABASE FINISH 会报 ORA-16038 或 ORA-19909很多 DBA 在 CANCEL 后直接 ALTER DATABASE OPEN,这会导致控制文件状态不一致、后续无法重建 DG:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH,它会强制应用所有可用日志并校验一致性ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE(19c 推荐)或 ALTER DATABASE OPEN RESETLOGS
DB_UNIQUE_NAME 和 DBID 已变更,不能再简单拉起旧实例真正难的不是命令本身,而是故障瞬间的判断节奏——mount 主库的窗口可能只有几十秒,GAP 补全需要手动拷贝归档文件,而 FINISH 命令一旦失败,就没有重试机会。这些操作没有容错余地,必须在脑中预演过三遍再动手。