ora-19566报错本质是校验失败,需调整maxcorrupt阈值而非跳过坏块;skip offline/inaccessible仅跳过文件级异常,不处理坏块;blockrecover可精准修复,event 19548为高风险绕过手段。
ora-19566 报错本质是校验失败,不是“能跳过”而是“要不要放宽阈值”
rman 默认对每个数据文件设定了 maxcorrupt 为 0 —— 意思是只要发现 1 个坏块就中止备份。报 ora-19566: exceeded limit of 0 corrupt blocks for file 并不表示 rman 支持“跳过坏块继续备份”,而是它严格执行了这个零容忍策略。你真正能调整的,是这个阈值本身。
-
SET MAXCORRUPT FOR DATAFILE n TO m必须在RUN块内使用,且只对紧随其后的BACKUP命令生效 - 例如:要允许第 7 号文件最多 10 个坏块,写法是
run { set maxcorrupt for datafile 7 to 10; backup datafile 7; } - 该设置不影响恢复(
RESTORE)或归档日志备份;对BACKUP ARCHIVELOG完全无效 - 阈值调高后,RMAN 仍会记录所有坏块位置到
V$DATABASE_BLOCK_CORRUPTION,但不会中断备份流程
SKIP OFFLINE 和 SKIP INACCESSIBLE 是文件级跳过,和坏块无关
有人混淆了“跳过离线文件”和“跳过文件内坏块”。SKIP OFFLINE 只在 BACKUP 命令中起作用,它跳过的是状态为 OFFLINE 的整个数据文件(比如因磁盘故障被手工 offline),而不是文件里某几个 block。同理,SKIP INACCESSIBLE 跳过的是无法打开的文件(权限不足、路径不存在、裸设备不可读等),也不是坏块处理机制。
- 若文件处于
ONLINE状态但含坏块,加SKIP OFFLINE完全没用,照样报ORA-19566 -
SKIP INACCESSIBLE在备份时可能绕过某些物理损坏文件,但它不校验块内容,也无法修复或跳过已打开文件内的逻辑坏块 - 这两个参数都不改变 RMAN 对已打开文件内部 block 的校验行为
真想绕过坏块还原?只有 EVENT 19548,但后果严重
RMAN 的 RESTORE 阶段若遇到备份集里含坏块(比如备份时未检测出、或介质损坏),默认拒绝写入目标文件。ALLOW CORRUPTION 不是合法参数,任何尝试都会报 RMAN-00571 或语法错误。唯一被 Oracle 文档提及的“绕过校验”方式,是隐含事件 19548:
- 启用前必须重启实例或至少执行
ALTER SYSTEM CHECKPOINT,否则 RMAN 不感知 - 命令是:
ALTER SYSTEM SET EVENTS '19548 trace name context forever, level 10'; - 它让 RMAN 在
RESTORE时不校验备份片 block 校验和,直接写入原始字节 —— 若该 block 逻辑已损(如 ITL 错乱),后续SELECT可能直接报ORA-01578 -
EVENT 19548对RECOVER阶段无效,归档/重做应用仍可能失败
BLOCKRECOVER 才是精准修复,不是跳过
与其冒险整体绕过,不如定位并单独修复坏块。RMAN 的 BLOCKRECOVER 命令专为此设计,它从备份中提取指定 block 进行替换,其余正常 block 完全不动:
- 先查坏块:
SELECT * FROM V$DATABASE_BLOCK_CORRUPTION; - 再恢复:
BLOCKRECOVER DATAFILE 5 BLOCK 147;(对应报错里的 file #5, block #147) - 支持批量:
BLOCKRECOVER DATAFILE 5 BLOCK 147,148 DATAFILE 7 BLOCK 201; - 若坏块所在对象访问不频繁,可配合
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS让查询自动跳过,但 DML 仍失败 —— 这是应用层临时规避,不是数据修复
坏块问题从来不是“跳过就能解决”的简单开关题。MAXCORRUPT 是备份容忍度调节,BLOCKRECOVER 是最小粒度修复,而 EVENT 19548 是最后手段的有损抢救。真正容易被忽略的点是:这些操作都依赖备份集本身完好 —— 如果坏块出现在备份片里,BLOCKRECOVER 也无源可溯,此时只能回退到更早备份或启用 DBMS_REPAIR 配合导出抢救可用数据。











