必须先停MRP进程并确保备库处于MOUNTED状态,再执行convert to snapshot standby;否则报ORA-16139等错误。需取消日志应用、关闭数据库、启动到MOUNT、配置FRA,转换后手动OPEN,本地修改将在切回物理备库时全部丢失。

必须先停掉 MRP 进程、确保备库处于 MOUNTED 状态,再执行 alter database convert to snapshot standby;否则会报错 ORA-16139: media recovery required 或直接卡住。
转换前必须停掉 MRP 进程
MRP(Managed Recovery Process)正在运行时,数据库处于日志应用状态,无法切换角色。强行执行 alter database convert to snapshot standby 会失败,典型错误是:
ORA-16139: media recovery required-
ORA-16664: unable to receive the result from a database(尤其在 DG Broker 环境下)
正确做法是先取消日志应用:
alter database recover managed standby database cancel;
再确认进程已退出:
select process, status, sequence# from v$managed_standby where process = 'MRP0';
返回空结果才算真正停止。
备库必须处于 MOUNTED 状态,不能是 OPEN READ ONLY
如果备库当前是 READ ONLY WITH APPLY(即 ADG 模式),不能直接转 Snapshot Standby。必须先关库再启到 MOUNT:
shutdown immediatestartup mount
检查状态是否符合预期:
select database_role, open_mode from v$database;
输出应为:PHYSICAL STANDBY / MOUNTED。若仍是 READ ONLY,说明没真正关闭应用,需重试取消 MRP 步骤。
闪回区(FRA)必须配置,但无需开启 Flashback Database
Snapshot Standby 底层依赖闪回恢复点(guaranteed restore point),所以 db_recovery_file_dest 和 db_recovery_file_dest_size 必须已设置且空间充足:
show parameter db_recovery_file_dest;
常见疏漏点:
- FRA 目录权限不对(Oracle 用户无写权限)
- FRA 已满,导致创建
SNAPSHOT_STANDBY_REQUIRED_*恢复点失败,报错ORA-38783: cannot create guaranteed restore point - 误以为要开
FLASHBACK ON—— 实际上select flashback_on from v$database;返回NO完全不影响使用
转换后需手动 open,且写操作会被后续还原擦除
执行完 alter database convert to snapshot standby 后,数据库仍处于 MOUNTED,必须显式执行:
alter database open;
此时 open_mode 变为 READ WRITE,可建表、插入、跑脚本。但要注意:
- 主库 redo 仍在持续接收并归档,只是不应用
- 所有本地修改(包括用户数据、临时对象、甚至
CREATE TABLE AS SELECT生成的段)在切回物理备库时都会被丢弃 - 切回命令是
alter database convert to physical standby,之后必须重启并启动 MRP,从转换那一刻的 SCN 开始重放日志
最容易被忽略的是:切回前必须保证 FRA 中还留有转换点之后接收到的所有归档日志 —— 如果归档被自动清理或手工删过,convert to physical standby 会因日志缺失而卡在“等待 gap”状态,无法继续。











