物理备库上不能直接用RMAN RESTORE DATAFILE修复损坏块,因MRP进程独占控制文件与归档流,RESTORE会破坏块一致性并触发ORA-01113/ORA-01157;有效修复仅两种:一是主库备份+SWITCH DATAFILE,二是CREATE DATAFILE后由MRP自动恢复。
oracle 19c 物理备库(physical standby)不支持在 mount 或 read only 状态下执行 restore datafile——这不是权限问题,而是内核级拦截。mrp 进程持续独占控制文件与归档流,restore 的覆盖式写入会破坏块一致性,立刻触发 ora-01113 或 ora-01157;后续 alter database datafile x online 必然失败。
所谓“损坏块”需先确认是否真实物理损坏(如磁盘坏道、存储静默错误),还是仅逻辑不一致(如未及时应用日志)。前者无法靠日志前滚修复,必须替换物理副本;后者可由 MRP 自动修复。实操中优先验证:
V$DATABASE_BLOCK_CORRUPTION 确认块地址和类型(CORRUPTION_TYPE = 'PHYSICAL' 才需人工介入)DBVERIFY 或 RMAN VALIDATE DATAFILE X 排除误报V$ARCHIVED_LOG 是否存在对应 SCN 区间的归档(若缺失且主库已删,则无法仅靠日志修复)核心是绕过“在备库本地还原”,改用主库已有备份,通过 SWITCH DATAFILE 更新控制文件指针,让 MRP 自动续接日志流。前提是主库有该文件的完整备份,且备库能访问同一存储路径(NFS 或共享盘)。
LIST BACKUP OF DATAFILE 5; 确认主库备份存在且状态为 AVAILABLE
V$DATAFILE 中文件 5 的路径与备份片中记录的路径完全一致(大小写、斜杠方向、空格都不能错)RUN {<br> ALLOCATE CHANNEL c1 DEVICE TYPE DISK;<br> SWITCH DATAFILE 5 TO COPY;<br> RECOVER STANDBY DATABASE;<br> RELEASE CHANNEL c1;<br>}
SWITCH DATAFILE 5 TO COPY 不复制文件,只更新控制文件;它要求备份副本已存在于备库本地路径——若备份在主库磁盘,需先 RESTORE DATAFILE 5 到备库相同路径,再 SWITCH
当主库备份无法被备库访问,或文件过大传输成本高时,用 CREATE DATAFILE 注入空文件头,交由 MRP 从主库拉取变更块填充。这要求文件未被 DROP,仅物理损坏。
SELECT FILE#, NAME, TABLESPACE_NAME FROM V$DATAFILE WHERE FILE# = 5;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE CREATE DATAFILE '/u01/oradata/STBY/users01.dbf' AS '/u01/oradata/STBY/users01.dbf';(路径必须与主库 V$DATAFILE 完全一致)ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
注意:如果 V$DATABASE 中 CONTROLFILE_TYPE = 'STANDBY',但 CREATE DATAFILE 报 ORA-01516,说明控制文件未同步最新结构,需先从主库 RESTORE STANDBY CONTROLFILE FROM SERVICE primary_db。