ABMR仅修复物理坏块,需同时满足:Active Data Guard启用、LOG_ARCHIVE_CONFIG含DG_CONFIG、FAL_SERVER指向对端、数据库OPEN(备库需USING CURRENT LOGFILE),缺一不可。

坏块修复失败,大概率不是命令写错了,而是ABMR没触发或RMAN找不到可用源——得先分清是物理坏块还是逻辑坏块,再看路径通不通、权限对不对、控制文件认不认。
ORA-01578报错但ABMR没自动修复?先确认四硬性前提
ABMR只修物理坏块,且必须同时满足:Active Data Guard已启用、LOG_ARCHIVE_CONFIG含DG_CONFIG列表、FAL_SERVER指向对端、数据库OPEN状态(备库需USING CURRENT LOGFILE)。缺一不可。
- 查
V$DATABASE确认GUARD_STATUS = 'STANDBY'且PROTECTION_MODE非MAXIMUM PROTECTION - 在备库执行
SHOW PARAMETER fal_server,输出必须是非空值;主库同理 - 检查
SELECT * FROM V$DATABASE_BLOCK_CORRUPTION——如果结果为空,说明Oracle内核根本没检测到物理坏块,ABMR不会启动 - 手动触发一次读取:用
SELECT COUNT(*) FROM test.adg(带坏块的表),再立刻查ALTER LOG里有没有Automatic block media recovery: successfully restored block字样
RMAN recover datafile block失败:常见断点在哪
RECOVER DATAFILE 6 BLOCK 2494856报错,往往卡在“找不到源块”或“归档不连续”,不是语法问题。
- 确保MRP已停:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL,否则RMAN直接拒绝执行 - 检查主库是否真有该块的干净副本:在主库运行
DBMS_REPAIR.CHECK_OBJECT或ANALYZE TABLE test.adg VALIDATE STRUCTURE CASCADE,确认V$DATABASE_BLOCK_CORRUPTION为空 - 若主库也报
ORA-01578,说明坏块已同步过去,ABMR和RMAN都无解,必须从备份恢复整个数据文件 - RMAN提示
no backup of block found时,不是备份没了,而是控制文件没注册——执行CATALOG START WITH '/path/to/archivelog/'补录归档
restore database from service失败:TNS与权限是隐形杀手
RECOVER STANDBY DATABASE FROM SERVICE 'testdb'失败,90%出在连接层,而不是SQL语法。
- TNS别名
testdb必须在备库$ORACLE_HOME/network/admin/tnsnames.ora里存在,且CONNECT_DATA中SERVICE_NAME与主库V$DATABASE.NAME一致 - RMAN连接时要用
target /(本地sysdba),connect '/@testdb'必须能连通主库监听——用tnsping testdb和sqlplus /@testdb双验证 - 主库
REMOTE_LOGIN_PASSWORDFILE必须为EXCLUSIVE,且sys密码文件在备库$ORACLE_HOME/dbs/orapw$ORACLE_SID里同步更新过 - 如果主库用ASM,备库RMAN执行
FROM SERVICE时会尝试访问主库ASM路径,此时需确保asm_diskstring在主库侧可读,或改用NOFILENAMECHECK绕过路径校验
recover database noredo后仍ORA-01157:控制文件残留旧记录
执行RESTORE DATABASE + RECOVER DATABASE NOREDO后启动仍报ORA-01157: cannot identify/lock data file 4,说明控制文件还记着那个文件,但磁盘上没了。
- 先查
SELECT FILE_ID, FILE_NAME FROM DBA_DATA_FILES WHERE FILE_ID = 4,确认路径是否存在;若不存在,用ALTER DATABASE DATAFILE 4 OFFLINE DROP(仅限备库) - 如果
DBA_DATA_FILES里没这条记录,但V$DATAFILE里还有,说明控制文件未同步——需从主库重新备份控制文件并RESTORE CONTROLFILE -
NOREDO只适用于“刚还原完所有数据文件+控制文件,且尚未应用任何归档”的场景;若之前MRP已跑过部分日志,加NOREDO会导致块头SCN倒退,触发ORA-00600 [ktbdchk1: bad dscn] - 最稳做法:停MRP →
RESTORE DATABASE→RECOVER DATABASE(不加NOREDO)→ 等RMAN自己拉归档补全,哪怕慢一点
真正容易被忽略的是:ABMR日志只写在主库alert.log里,备库alert.log不会记录“我修好了”,而RMAN恢复过程中的归档断点,往往藏在V$ARCHIVED_LOG.NEXT_CHANGE#和FIRST_CHANGE#的缝隙里,不是靠重试就能跨过去的。


















