abmr是唯一原生支持主库坏块自动从备库拉取完好块覆盖的机制,需同时满足adg启用、db_block_checking=off、db_lost_write_protect=none及仅限物理坏块四个前提。

不能直接用备库恢复主库坏块——RMAN的 BLOCKRECOVER 不支持跨库拉取块,除非启用 ABMR。
ABMR 是唯一能自动从备库修复主库物理坏块的机制
Oracle 19c Active Data Guard 的 Automatic Block Media Recovery(ABMR)是唯一原生支持“主库坏块 → 自动从备库拉取完好块覆盖”的路径。它不是 RMAN 命令触发的,而是数据库后台进程在读取到物理坏块时自动发起的。
- 必须同时满足四个硬性前提:主备库均开启 ADG、
DB_BLOCK_CHECKING=OFF(默认)、DB_LOST_WRITE_PROTECT=NONE(默认)、且坏块类型为物理坏块(如校验和失败、I/O read error) - 逻辑坏块(如索引键重复、ITL slot 损坏)ABMR 完全不处理,会直接报
ORA-01578并中止操作 - 验证 ABMR 是否生效:查
v$block_recovery,非空即表示正在或刚完成自动恢复;同时检查 alert.log 中是否出现 “ABMR: recovered block” 类日志
BLOCKRECOVER 只能基于本地备份,不能指定备库为源
很多人误以为 BLOCKRECOVER DATAFILE 6 BLOCK 12 可以让 RMAN 去备库“拿块”,实际它只会扫描当前控制文件里注册的备份集(来自 CATALOG START WITH 或恢复目录),完全不感知备库是否存在。
- 若主库有可用备份(归档 + 全备/增量),
BLOCKRECOVER能在线修复,且不中断业务 - 若主库无备份但备库有完整归档链,你得先手动把备库的归档日志拷回主库,再
CATALOG ARCHIVELOG注册,否则 RMAN 根本看不到那些日志 - 执行前务必确认坏块对象类型:索引块损坏可直接
DROP INDEX ... REBUILD;表块损坏才需BLOCKRECOVER,否则白等
手动模拟“从备库取块”需绕过 RMAN,走数据泵 + 逻辑导出
当 ABMR 不适用(比如逻辑坏块)、又没主库备份时,唯一可行的“从备库救数据”方式是逻辑层操作,而非块级。
- 在备库上用
expdp导出受损段(如SCHEMAS=livan TABLES=test),注意加CONTENT=DATA_ONLY避免 DDL 冲突 - 主库停写后,用
impdpTABLE_EXISTS_ACTION=REPLACE覆盖受损表数据 - 该方法无法修复 LOB、物化视图日志等隐式结构,且要求主备字符集一致,否则导入时报
ORA-39112
ABMR 的触发是静默的,不会写入 RMAN 备份记录;而 BLOCKRECOVER 的每一步都依赖控制文件里精确注册的备份元数据——这两条路径底层完全隔离,混用会导致误判故障原因。











