确认备库本地坏块需三步:查错误参数是否含[kcbz_check_objd_typ_3]等标识;在备库运行rman validate datafile check logical并用dbv离线扫描定位corrupt block;再在主库对同一文件执行validate,若主库通过而备库报错,则100%锁定为备库本地i/o问题。
直接换掉坏块所在文件,而不是等mrp重试或手动传归档——90%以上备库ora-00600报错根子在本地i/o,不是主库数据问题。
怎么确认是备库本地坏块而非主库传过来的脏数据
别信V$DATABASE_BLOCK_CORRUPTION为空就代表没坏块,它只记录RMAN扫描结果,不反映实时读取失败。重点看三处:
- 错误堆栈里是否含
[kcbz_check_objd_typ_3]、[4000]、[4193]这类标识——它们都指向备库自己读数据文件时校验失败 - 在备库跑
RMAN> VALIDATE DATAFILE <file> CHECK LOGICAL</file>,加CHECK LOGICAL才查逻辑+物理双层校验 - 用
dbv file=<datafile_path> blocksize=8192</datafile_path>离线扫,盯住输出里Corrupt block relative dba行;再在主库对同一file#跑一遍VALIDATE,若主库通过而备库报错,100%锁定本地问题
坏块定位后要不要覆盖主库文件
可以,但必须满足两个前提:主库VALIDATE通过 + 备库dbv已精确定位到具体block#。覆盖前务必:
- 用
cp users01.dbf users01.dbf.bak备份原文件 - 覆盖后别急着
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE - 先用
dd if=users01.dbf of=/dev/null bs=8192 skip=<block_num> count=1</block_num>测试该块能否稳定读取;若dd报I/O错误,说明是ASM disk、OS磁盘或内存问题,得查硬件,不是文件内容问题
RMAN增量恢复比文件覆盖更稳妥的适用场景
当坏块不止一个、或者你不敢动运行中的数据文件时,走RMAN在线增量恢复更安全。关键动作链:
- 在备库查基准SCN:
SELECT MIN(CHECKPOINT_CHANGE#) FROM V$DATAFILE_HEADER WHERE FILE# NOT IN (SELECT FILE# FROM V$DATAFILE WHERE ENABLED = 'READ ONLY')(注意用CHECKPOINT_CHANGE#,不用CURRENT_SCN) - 主库执行:
BACKUP INCREMENTAL FROM SCN <scn_value> DATABASE FORMAT '/nfs/inc_for_standby_%U.bkp' TAG 'FOR_STANDBY_REBUILD'</scn_value>(路径需主备都能访问,或scp传过去) - 备库执行:
CATALOG START WITH '/nfs/inc_for_standby_'; RECOVER DATABASE NOREDO;(别OPEN,也别启MRP,让后续DG自动接续)
真正容易被忽略的是:坏块修复后,dbv和RMAN VALIDATE都通过了,不代表底层I/O稳定——得持续观察MRP0进程是否反复卡在同一个归档上,那大概率是存储层还在掉块。











