ORA-19566 表示 RMAN 主动拒绝备份含坏块的数据,需先查 v$database_block_corruption 确认坏块位置及类型(CORRUPT/FRACTURED/LOGICAL),再据类型分路径修复:物理坏块须先处理存储硬件,逻辑索引可重建,逻辑表优先 ALTER TABLE MOVE;误用 maxcorrupt 或跳过选项将掩盖风险。
ORA-19566 不是备份失败,是 RMAN 主动拒绝把坏块写进备份集——它在喊“这数据不能信”,不是在说“我不会备份”。
这个视图记录的是 Oracle 已确认的坏块位置,不是猜测、不是日志推断。空结果不等于安全,但非空就代表必须立刻处理。
SELECT * FROM v$database_block_corruption;,拿到 FILE#、BLOCK#、CORRUPTION_TYPE
CORRUPTION_TYPE 常见值:CORRUPT(物理扇区失效)、FRACTURED(块头尾校验不一致)、LOGICAL(索引键乱序、LOB 指针断裂)BLOCK# 连续,说明不是单点故障,而是段级损坏,修复优先级高于孤立坏块RMAN> VALIDATE CHECK LOGICAL DATABASE; 或用 dbv 扫单个文件只知道文件和块号,就像知道车祸发生在“某条路第 123 米”,但不知道撞的是谁的车——修之前必须知道坏块属于哪张表、哪个索引或 LOB 段。
SELECT owner, segment_name, segment_type FROM dba_extents WHERE file_id = &F AND &B BETWEEN block_id AND block_id + blocks - 1;(&F 和 &B 替换为上一步查到的值)alert.log 中的 Corrupt Block Found 行比对 OBJN/OBJD
ANALYZE TABLE xxx VALIDATE STRUCTURE CASCADE; 可触发更细粒度校验,但会锁表,OLTP 环境慎用BACKUP DATABASE 不校验 LOB 内容,必须显式加 CHECK LOGICAL
物理坏块和逻辑坏块的修复成本、风险、依赖条件完全不同。拿重建索引当万能药,等于给心脏手术用创可贴。
CORRUPT 或 FRACTURED:本质是存储层问题。RAID 降级、磁盘扇区失效、ASM 磁盘亮红灯——必须先换硬件或重建阵列,再用 RECOVER DATAFILE 或 BLOCKRECOVER;DBMS_REPAIR 只能跳过,不能修复LOGICAL 且是索引:最安全快捷。DROP INDEX idx_name; + CREATE INDEX,无需停业务LOGICAL 且是表:优先尝试 ALTER TABLE xxx MOVE;(会重建段并跳过坏块),但注意索引失效、LOB 存储属性重置;不可行时再考虑 EVENT 10231 + CREATE TABLE AS SELECT
它只在一个 run { } 块内生效,且必须绑定具体数据文件。设了不代表安全,只代表你愿意让坏块原封不动进备份集。
run { set maxcorrupt for datafile 4 to 10; backup datafile 4; }
set maxcorrupt to 10(语法不合法)、set maxcorrupt for datafile 4 to 100 却执行 backup database(不生效)FILE# 显示 3、7、12 都有),得为每个文件单独设一次SKIP OFFLINE 和 SKIP INACCESSIBLE 是文件级跳过,对已打开文件内的坏块完全无效真正容易被忽略的点是:坏块类型决定修复路径,而类型判断依赖 v$database_block_corruption.CORRUPTION_TYPE 的准确解读——LOGICAL 不等于“可以随便重建”,CORRUPT 也不等于“必须整个文件恢复”。修之前没看清这一行,后面所有操作都在赌运气。