`
yunnick
  • 浏览: 392236 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

索引块丢失导致的ora-08102异常及解决方案

 
阅读更多

       “出现Ora-8102的原因一般是由于索引中的KEY和TABLE里的相关字段值不同导致数据不一致引起。一般来说,出现ORA-8102,是由于数据库逻辑或者物理故障引起的,损坏的可能是表数据,也可能是索引数据。如果损坏的是索引数据,那么只需要将索引重建就可以使表和索引数据一致,从而解决问题。如果损坏的是表数据,那么要看损坏的范围,如果只是损坏了某一行,那么纠正某一行的数据就可以了,如果损坏的面积较大,那么处理起来就比较复杂。”

        目前开发的一个系统,每天需要大量的删除和插入操作,最近遇到了异常,当删除数据时报错,类似:

 ora-08102:index key not found,是索引出了问题,重建索引即可。使用以下语句重建:

alter index indexname rebuild (online);

 网上找了下,整理了需要重建索引的场景和标准:

 

1、考虑重建索引的场合

  • 表上频繁发生update,delete操作(我们目前的系统会频繁的delete和insert)
  • 表上发生了alter table ..move操作(move操作导致了rowid变化)

 2、重建标准

    索引重建是否有必要,一般看索引是否倾斜的严重或者是否浪费了空间:Oracle使用B树构建索引,如果B数的高度超过3 或者删除的索引占用的空间超过了20%,即表明需要重建(以上信息可以通过视图INDEX_STATS获得)。有两种方式可以使用:

   1) drop 原来的索引,然后再创建索引;
    2) alter index indexname rebuild (online);
    方式一:无法在24*7环境中实现。
    方式二:可以在24*7环境中实现,我们目前使用这种方式。

 

下面是我整理的一个sql脚本,可以定时调用执行,防止ora-08102异常,将indexname替换为具体的索引名称即可:

declare
  type IdxInfo is record
  (
    height number,
    delPer number
  );
  info IdxInfo;
begin
  execute immediate 'analyze index indexname validate structure';
  select height, t.del_lf_rows/t.lf_rows  into info from index_stats t where name = 'indexname';
  dbms_output.put_line('per:'||info.delPer||' h:'||info.height);
  
  if info.height >=4 or info.delPer > 0.2 then
    dbms_output.put_line('need rebuild');
    execute immediate 'alter index indexname rebuild online';
  else
    dbms_output.put_line('no need rebuild'); 
  end if;
exception
  when others then
    execute immediate 'alter index indexname rebuild online';
    dbms_output.put_line('error'|| sqlerrm);
end;

 

 

参考:ORACLE INDEX重建       视图INDEX_STATS描述

0
0
分享到:
评论

相关推荐

    Oracle 授权 ORA-00990: 权限缺失或无效

    在本篇文章中,我们将深入探讨这个问题的原因、解决方案以及如何正确地授权和管理Oracle数据库的权限。 1. **错误原因**: - 用户未被授予执行特定操作所需的系统权限,例如UPDATE、DELETE、SELECT或INSERT。 - ...

    [Oracle] 浅析令人抓狂的ORA-01555问题

    解决方案包括增加Undo表空间的大小,并设置适当的UNDO_RETENTION参数以确保undo记录足够长时间的保留。 - **延迟的块清除**:在某些情况下,特别是OLAP(在线分析处理)系统中,大量插入或更新操作后,数据库可能...

    oracle11g 内部参数出错问题

    Oracle 11g 内部错误代码 ORA-00600 是一个非常通用的错误,它表示数据库遇到了一个无法处理的内部错误或异常情况。这个错误通常涉及到Oracle数据库的底层结构,如数据块、索引或者内存管理等,且参数列表可以提供...

    oracle错误一览表

    ORA-00026: 丢失或无效的会话ID - **描述**: 会话ID缺失或无效时触发。 - **解决方法**: 使用有效的会话ID或重新建立连接。 #### 12. ORA-00027: 无法删去当前会话 - **描述**: 尝试删除正在使用的会话时触发。 - ...

    Oracle错误大全

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,...在实际工作中,遇到错误时应首先查看Oracle官方文档或相关的技术论坛,通过错误代码寻找解决方案,必要时可以求助于Oracle技术支持或经验丰富的数据库专家。

    ORACLE运行报错.doc

    在遇到这些问题时,首先检查错误日志以获取更详细的信息,然后根据具体错误代码查找Oracle文档或社区论坛上的解决方案。有时,修复可能需要调整数据库参数、重新配置系统资源、更新用户权限或者执行特定的数据库操作...

    Oracle错误代码

    ### Oracle错误代码详解 在Oracle数据库管理与维护过程中,遇到各种错误代码是在所难免的。...然而,每个错误的具体原因和解决方案可能因具体环境和配置而异,因此在实际操作中还需要结合具体的场景进行分析和处理。

    oracle坏块处理

    1. **异步I/O配置不当**:如果数据库服务器启用了异步I/O或写进程数量过多,可能导致数据同步异常,引发数据块损坏。 2. **硬件I/O故障**:硬盘读写错误、控制器故障等硬件问题也是常见的诱因。 3. **操作系统I/O或...

    oracle错误代码[参考].pdf

    Oracle数据库在运行过程中可能会遇到各种错误,这些错误通常以错误代码的形式出现,帮助数据库管理员识别问题并找到解决方案。本文将详细解析与Oracle错误代码相关的知识点,以帮助理解这些错误的含义及其背后的...

    oracle错误码一览表

    Oracle错误码是数据库系统在运行过程中遇到问题时抛出的特定编号,用于帮助开发者和DBA识别并解决遇到的问题。...当遇到新的错误码时,可以参考Oracle官方文档或在线社区获取详细的解释和解决方案。

    Oracle数据库错误消息

    - **解决方案**:核实表名是否正确,必要时重建或恢复丢失的表。 ### EXP-00012 字符串不是一个有效的导出模式 - **错误描述**:指定的导出模式无效。 - **解决方案**:使用正确的导出模式重试,确保符合Oracle...

    Oracle坏块故障葵花宝典.docx

    然而,在执行索引扫描时遇到了ORA-01578错误,推测索引可能存在坏块。通过查询`dba_extents`表定位到有问题的索引,并重建相关索引后,问题得以解决。 **解决方案** - 登录数据库并检查表`ep_tablet`的数据完整性...

    oracle 10g 管理 sql 错误解决

    了解错误背后的含义和解决方案是提升数据库管理技能的关键。 1. **SQL语法错误**:这是最常见的错误类型,包括拼写错误、遗漏关键字、未正确关闭语句等。例如,忘记在SELECT语句后添加FROM子句会导致ORA-00922错误...

    ora-sys-tools:Oracle 数据库的系统工具

    同时,对数据库进行任何操作前,都应该先做好数据备份,防止意外情况导致数据丢失。此外,理解每个工具的用途和使用方法至关重要,以避免误操作。 总之,ora-sys-tools-master这个工具集可以极大地提高Oracle数据库...

    Ora10GErr_Msg

    Oracle 10g是Oracle公司于2003年发布的一个重要的数据库管理系统的版本,提供了一套全面的数据管理和分析工具,广泛应用于企业级数据库解决方案。 Oracle数据库10g中的错误消息通常包含了丰富的信息,如错误代码、...

    Oracle错误代码一览表

    ### Oracle错误代码详解 在处理Oracle数据库时,遇到错误是在所难免的,而理解这些错误代码的意义...在遇到错误时,除了查阅Oracle官方文档外,还可以参考社区论坛、技术博客等资源,以获取更多的解决方案和最佳实践。

Global site tag (gtag.js) - Google Analytics