ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

oracle坏块导致备份不了

oracle坏块导致备份不了 问题Oracle 数据文件出现坏块典型报错 ORA-01578 数据块损坏、ORA-19566 坏块数超过 MAXCORRUPT 限制导致 RMAN 备份无法完成、备份任务失败需要既处理坏块又让备份能够跑完。方案场景一先定位并确认坏块所有处理的起点不要直接动手修先把「坏块在哪个文件、哪个块、属于哪个对象、是物理坏块还是内存坏块」确认清楚。从 alert 日志拿第一手线索搜索Bad header found during backing up datafile、Corrupt block relative dba、Corrupt Block Found等关键字记录文件号与块号。-- 查看 alert 日志11g 及以后-- adrci show alert -tail 100用 RMAN 校验不实际备份只扫描RMAN BACKUP VALIDATE CHECK LOGICAL DATABASE; -- 或只校验单个数据文件 RMAN BACKUP VALIDATE CHECK LOGICAL DATAFILE 5; RMAN VALIDATE DATAFILE 5 BLOCK 131;查坏块登记视图SELECTfile#, block#, blocks, corruption_type, object# FROM V$DATABASE_BLOCK_CORRUPTION;用 dbv 做文件级物理扫描可在库外执行dbv file/oradata/xxx/tbs_test01.dbf⚠️ 注意dbv 输出的文件编号可能不准确不能直接把 dbv 的编号用于 BLOCKRECOVER需通过VALIDATE日志或V$DATAFILE核对真实文件号SELECTfile#, name, status FROM V$DATAFILE;把坏块落到对象上判断影响面SELECTo.owner,o.object_name,o.object_type,o.subobject_nameFROMdba_objects oWHEREo.data_object_idobject_id;排除内存坏块若工具扫描未发现坏块、但查询仍报错可能是缓冲区内的内存坏块可先刷新缓冲区缓存再复测ALTERSYSTEM FLUSH BUFFER_CACHE;场景二按对象类型处理坏块1索引坏块 → 直接重建ALTERINDEX索引所有者.索引名 REBUILD;-- 或指定表空间重建ALTERINDEX索引所有者.索引名 REBUILDTABLESPACE目标表空间;2表坏块且存在可用 RMAN 备份 → 块介质恢复Block Media Recovery优先方案只恢复受损数据块无需恢复整个数据文件不必将数据文件或表空间离线停机影响最小。RMAN BLOCKRECOVER DATAFILE 5 BLOCK 131; -- 恢复 V$DATABASE_BLOCK_CORRUPTION 中登记的全部坏块 RMAN BLOCKRECOVER CORRUPTION LIST; -- 限定从某时间点之前的备份恢复 RMAN BLOCKRECOVER CORRUPTION LIST RESTORE UNTIL TIME SYSDATE - 7;前提条件存在有效的全量备份 归档日志且备份中对应块本身未损坏。恢复过程会输出restoring block(s)→reading from backup piece→media recovery complete等阶段。若损坏范围较大或块介质恢复失败可退化为整文件恢复RMAN RESTORE DATAFILE 5; RMAN RECOVER DATAFILE 5;3自动块介质恢复ABMROracle 支持在查询/访问到坏块时自动触发块介质恢复也可通过SELECT触发验证修复效果。修复后可再次VALIDATE确认Marked Corrupt为 0。4表坏块但无可用备份 → DBMS_REPAIR 标记跳过会丢数据谨慎评估适用于物理坏块无法用备份修复、且业务能接受少量数据丢失的场景。-- 1) 建立修复表EXECDBMS_REPAIR.ADMIN_TABLES(REPAIR_TABLE,1,USERS);EXECDBMS_REPAIR.ADMIN_TABLES(ORPHAN_TABLE,2,USERS);-- 2) 扫描对象登记坏块DECLAREv_num NUMBER;BEGINv_num :DBMS_REPAIR.CHECK_OBJECT(schema_nameSCOTT,object_nameT1,repair_table_nameREPAIR_TABLE);END;/-- 3) 标记坏块DECLAREv_num NUMBER;BEGINv_num :DBMS_REPAIR.FIX_CORRUPT_BLOCKS(schema_nameSCOTT,object_nameT1,fix_countNULL,repair_table_nameREPAIR_TABLE);END;/-- 4) 设置跳过坏块使对象可访问DECLAREv_num NUMBER;BEGINv_num :DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(schema_nameSCOTT,object_nameT1);END;/边界DBMS_REPAIR 只处理事务层/数据层的软件损坏对物理损坏块的修复能力有限标记跳过后被跳过块的数据会丢失典型案例1000 行的表查询后只剩 917 行丢失 83 行。建议跳过只是让对象「能用」最终应把好数据导出后重建表。5表坏块 → 提取好数据后重建表通过 ROWID 分段扫描把未损坏的数据导出到新表再改名替换注意可能产生重复行需配合去重逻辑。6未使用的空块 → 可忽略不影响对象访问。场景三备份遇到坏块ORA-19566如何把备份跑完现象RMAN 报ORA-19566: exceeded limit of 0 corrupt blocks备份终止。根因是数据文件中有坏块而 RMAN 默认 MAXCORRUPT 0零容忍。处理优先级先尽量修复坏块再备份确实无法修复时才放宽容忍度。1首选先做块介质恢复再正常备份按场景二用BLOCKRECOVER/ ABMR 修复坏块修复后重新执行备份即可。2次选临时放宽 MAXCORRUPT让备份跳过坏块先完成RMAN run { SET MAXCORRUPT FOR DATAFILE 5 TO 100; BACKUP DATABASE; }含义允许数据文件 5 在本次备份中最多忽略 100 个坏块使备份能够完成。⚠️必须写在run { }块内直接执行SET MAXCORRUPT ...会报RMAN-03031: this option of set command needs to be used inside a run block。这只是「让备份先跑完」坏块并未修复备份完成后仍需按场景二修复坏块并再次备份验证。3验证坏块是否真正消除RMAN BACKUP VALIDATE CHECK LOGICAL DATAFILE 5;确认输出中Marked Corrupt 0、各 Block Type 的 Failing Blocks 均为 0。场景四兜底与影响面控制确认备份可用的前提块介质恢复依赖有效的全量 归档备份若备份链断裂只能走 DBMS_REPAIR / 数据提取重建路线。对象级优先能用备份恢复的优先BLOCKRECOVER索引坏块优先REBUILD表坏块在无备份时才考虑 DBMS_REPAIR。数据一致性风险DBMS_REPAIR 跳过、Extract 提取都可能造成丢行或重复行处理前后务必核对行数与关键数据。根因排查坏块多由存储/IO/介质问题引起修复后应检查存储链路避免复发。
返回列表