快照备库需先配好本地FRA并停MRP进程,再执行CONVERT TO SNAPSHOT STANDBY和ALTER DATABASE OPEN;切回物理备库会丢弃所有测试期变更。

快照备库不是“打开读写权限”就能用的临时模式,而是依赖闪回机制的一次性隔离环境;没配好快速恢复区(FRA)、没停掉MRP进程、漏掉ALTER DATABASE OPEN,90% 会卡在 MOUNTED 状态或报 ORA-38705 / ORA-16139。
必须提前配好快速恢复区(FRA)且空间充足
FRA 是快照备库的底层支撑,不是可选项。它要存还原点(guaranteed restore point)和闪回日志,但不强制开启 FLASHBACK DATABASE。关键约束有三点:
-
db_recovery_file_dest必须指向本地文件系统或 ASM 磁盘组,不能是 NFS 挂载点(否则RVWR进程启动失败) - 空间建议 ≥ 主库 2 小时归档量 + 测试期间预估写入量(比如插入 100 万行 × 200 字节 ≈ 200MB redo)
- 执行前查空间水位:
SELECT NAME, SPACE_LIMIT, SPACE_USED FROM V$RECOVERY_FILE_DEST;,若SPACE_USED / SPACE_LIMIT > 0.85,先清理或扩容 - 改大小后必须加
SCOPE=BOTH:ALTER SYSTEM SET db_recovery_file_dest_size=20G SCOPE=BOTH;,否则重启失效
转换前必须彻底停掉 MRP 进程
物理备库在 READ ONLY WITH APPLY 模式下不能直接转快照——必须先停日志应用,再确认 MRP 已退出,否则 CONVERT TO SNAPSHOT STANDBY 会 hang 或报 ORA-16139。
- 发取消指令:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 等几秒后验证:
SELECT PROCESS, STATUS, CLIENT_PROCESS FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0';,返回空或STATUS = 'IDLE'才算成功 - 若仍为
APPLYING_LOG,别跳步,继续查;强行下一步大概率失败 - 三步缺一不可:取消应用 →
SHUTDOWN IMMEDIATE→STARTUP MOUNT
CONVERT 后必须显式 OPEN,否则连不上
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY 只改控制文件标记,不自动 open 数据库。很多人以为“转换完成”就能连,结果 sqlplus / as sysdba 直接报 ORA-01033。
- 严格顺序:
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;→ALTER DATABASE OPEN; - 验证是否生效:
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;,应返回SNAPSHOT STANDBY和READ WRITE - 此时才能执行测试 SQL:
INSERT INTO test_table VALUES (1, 'test');,数据只存在于该快照周期内
测试完切回物理备库时,所有快照期 DML/DDL 都会被丢弃
快照备库的本质是“带还原点的闪回数据库”,切回物理备库的过程就是一次隐式闪回恢复:控制文件重置、还原点删除、所有测试期变更清零。
- 切回前必须
SHUTDOWN IMMEDIATE→STARTUP MOUNT - 执行:
ALTER DATABASE CONVERT TO PHYSICAL STANDBY; - 再
SHUTDOWN IMMEDIATE→STARTUP→ 开启日志应用:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; - 原测试表里的
INSERT数据会消失,这是设计行为,不是 bug
最易被忽略的是 FRA 路径类型(NFS 不行)和 MRP 进程状态验证——这两个点不卡死,后续步骤全白忙;另外,CONVERT 后不 OPEN 是新手高频失误,连不上库时第一反应不该是查监听,而是看 V$DATABASE.OPEN_MODE。











