ITPub博客

首页 > 数据库 > Oracle > 如何快速解决Oracle数据库的数据块坏块

如何快速解决Oracle数据库的数据块坏块

原创 Oracle 作者:zhoul777 时间:2026-05-27 14:22:48 0 删除 编辑


如何快速解决Oracle数据库的数据块坏块修复步骤如下所示:


步骤 1:安全校验坏块(推荐 DBV,无宕机风险)

1.1 首选:DBV 工具(物理校验,100% 安全,不宕库)

DBV 是 Oracle 自带的物理坏块校验工具, 只读数据文件,不写入、不触发数据库内部操作,完全无风险。
# 语法:dbv file=数据文件路径 blocksize=数据库块大小dbv file=/u01/oradata/orcl/users01.dbf blocksize=8192
  • 输出会明确标注: 坏块数量、坏块位置(文件号 + 块号)、坏块类型(表 / 索引);
  • 支持所有数据文件, 同时校验表和索引坏块。

1.2 不推荐的校验方式(避坑)

  1. RMAN VALIDATE / EXPDP/EXP:扫描时会加载数据到内存,严重坏块可能触发实例宕机;
  2. EXPDP/EXP: 完全不校验索引坏块,会遗漏索引问题。

步骤 2:索引坏块处理(最简单,无数据丢失)

索引坏块是 最优处理场景,索引是表的冗余结构, 删除重建即可,不丢失业务数据。

关键规则

 禁止使用 ALTER INDEX ... REBUILD(坏块会导致重建失败)必须使用: 删除索引 + 重新创建索引
-- 1. 先查询坏块索引名称(根据DBV查到的文件号+块号)SELECT SEGMENT_NAME, SEGMENT_TYPE 
FROM DBA_EXTENTS 
WHERE FILE_ID = 文件号 AND 块号 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;-- 2. 删除坏块索引DROP INDEX 索引名;-- 3. 重新创建索引(和原索引定义一致)CREATE INDEX 索引名 ON 表名(字段名);
处理完成后,索引恢复正常,业务无影响。

步骤 3:表坏块处理(无备份,核心:跳过坏块抢救数据)

表坏块会导致 全表扫描报错、部分数据无法查询,无备份时 无法修复坏块数据,只能跳过坏块,抢救完好数据。
提供两种标准方案(官方 MOS 422547.1 推荐):

方案 1:设置 10231 事件(临时跳过坏块,推荐)

作用:让会话执行全表扫描时 自动跳过坏块,不报错。

方案 2:DBMS_REPAIR 包(标记坏块,长期使用)

作用:将坏块标记为「损坏」,数据库后续所有操作自动跳过,适合长期业务运行。
-- 1. 创建修复记录表BEGIN
  DBMS_REPAIR.ADMIN_TABLES (
    TABLE_NAME => 'REPAIR_TABLE',
    TABLE_TYPE => DBMS_REPAIR.REPAIR_TABLE,
    ACTION     => DBMS_REPAIR.CREATE_ACTION);END;/-- 2. 检测并标记坏块BEGIN
  DBMS_REPAIR.CHECK_OBJECT (
    SCHEMA_NAME => '用户名',
    OBJECT_NAME => '坏块表名',
    REPAIR_TABLE_NAME => 'REPAIR_TABLE');END;/-- 3. 跳过坏块查询数据SELECT * FROM 坏块表;

方案 3:ROWID 范围扫描(精准抢救数据)

手动分段查询,跳过坏块对应的 ROWID 区间,适合少量坏块场景。

步骤 4:BBED 工具

核心说明

  1. BBED 是 Oracle 内部未公开工具,仅支持非集群环境, 12c 及以上版本不支持;
  2. 操作复杂, 误操作会导致数据库彻底损坏;
  3. 无备份场景下,仅当坏块数据极其重要时尝试。

适用场景

仅修复 物理格式损坏的块(如块头校验错误), 逻辑损坏无法修复。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7965779/viewspace-3172318/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Liang Zhou的菜园

注册时间:2019-06-20

  • 博文量
    5
  • 访问量
    4504