Oracle 12c备库手动Media Recovery本质是人工控制应用归档或实时日志以同步主库,需在MOUNT状态执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE命令,禁用已弃用的RECOVER AUTOMATIC语法,并验证日志应用与SCN一致性。
手动执行 oracle 12c 备库的 media recovery,本质是让备库应用主库传来的归档日志(archivelog)或实时重做日志(standby redo log),从而保持与主库的数据同步。这不是“启动mrp进程”就完事——一旦 mrp 挂掉、日志堆积、或需跳过某段损坏日志时,你必须亲自介入并控制恢复节奏。
确认备库处于 MOUNT 状态且未开启实时应用
Media Recovery 只能在 MOUNT 状态下进行;如果备库已 OPEN READ ONLY,必须先关闭再重启到 MOUNT:
-
SHUTDOWN IMMEDIATE→STARTUP MOUNT - 检查当前状态:
SELECT OPEN_MODE, DATABASE_ROLE FROM V$DATABASE;,输出应为MOUNTED和PHYSICAL STANDBY - 确认 MRP(Managed Recovery Process)未运行:
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0';,若返回APPLYING_LOG,先用ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;中止
使用 ALTER DATABASE RECOVER ... 语法启动手动恢复
Oracle 12c 不再推荐用 RECOVER AUTOMATIC STANDBY DATABASE(该语法在 12c 中已被弃用),应统一使用带 USING CURRENT LOGFILE 或显式指定日志路径的 RECOVER 命令:
- 启用实时应用(推荐):
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; - 仅应用已归档日志(不依赖 standby redo log):
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; - 若需单步控制(如调试或跳过某日志),去掉
DISCONNECT,命令会阻塞等待人工干预;此时可配合ALTER DATABASE RECOVER MANAGED STANDBY DATABASE UNTIL SEQUENCE 123 THREAD 1;指定截止点
常见卡住/报错及绕过方式
手动恢复最常卡在三类地方:日志缺失、文件路径不一致、或 standby redo log 未就绪。不要直接查错误码再 Google,先看这几处:
- 报
ORA-00308: cannot open archived log:说明归档日志没传到备库或路径不对。检查LOG_ARCHIVE_DEST_2参数中VALID_FOR是否含(STANDBY_LOGFILE,STANDBY_ROLE),并确认ARCHIVE_LAG_TARGET是否过小导致主库未及时传输 - 报
ORA-01153: an incompatible media recovery is active:说明有另一个恢复会话正在运行。查V$SESSION找PROGRAM含MRP或RECOVER的 SID,用ALTER SYSTEM KILL SESSION 'sid,serial#';干掉 - 备库无 standby redo log 但启用了
USING CURRENT LOGFILE:会立即失败。必须提前创建,数量 ≥ 主库 online redo log 组数,且大小一致:ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 '/u01/oradata/stdby/srl4.log' SIZE 200M;
验证恢复进度与数据一致性
手动恢复不是“执行完命令就结束”,尤其在异机或网络不稳定环境下,必须交叉验证:
- 查已应用日志:
SELECT THREAD#, SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG WHERE APPLIED='YES' ORDER BY FIRST_TIME DESC FETCH FIRST 5 ROWS ONLY; - 对比主备 SCN:
SELECT CURRENT_SCN FROM V$DATABASE;在主库和备库分别执行,差值应 - 检查是否有 gap:
SELECT * FROM V$ARCHIVE_GAP;若有,需手工拷贝对应归档日志到备库并注册:ALTER DATABASE REGISTER PHYSICAL LOGFILE '/path/to/arch_123.arc';
真正容易被忽略的是:手动恢复过程中,STANDBY_FILE_MANAGEMENT 必须设为 AUTO,否则主库新增数据文件后,备库不会自动创建对应文件,后续恢复会直接报 ORA-01111。别等报错才想起来查这个参数。


















