Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3673121
  • 博文数量: 715
  • 博客积分: 1860
  • 博客等级: 上尉
  • 技术积分: 7745
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-07 08:51
个人简介

偶尔有空上来看看

文章分类

全部博文(715)

文章存档

2023年(75)

2022年(134)

2021年(238)

2020年(115)

2019年(11)

2018年(9)

2017年(9)

2016年(17)

2015年(7)

2014年(4)

2013年(1)

2012年(11)

2011年(27)

2010年(35)

2009年(11)

2008年(11)

分类: Oracle

2021-12-11 17:25:08

测试环境重建索引时遇到了ORA-08104,怎么办?

先看看这个报错:

等待是不可能等待的,那就修复一下,官方解释如下:

  1. 有时,索引的在线重建会报告 ORA-8104。
  2. 这可能有很多原因。
  3. 例如,在具有许多事务的高度活跃的数据库中,表上未提交事务的可能性很高。因此,如果这样的表需要重建索引,
  4. 由于未提交的事务,我们可能会看到此错误。在其他情况下,我们可能会看到一个死进程,其中一个未提交的事务持有表上的锁。这也阻止了我们重建索引。这完全是在线重建功能的设计。但是,我们不能让数据库永远处于这种状态,因此 SMON 旨在清除这些情况。
  5. 如果已使用命令 kill -9 从操作系统中杀死进程,则该进程最终可能会死亡。
  6. 如果进程在执行以下操作时被终止:
  7. ALTER INDEX REBUILD ONLINE;
  8. 那么该可能最终处于需要清理的状态。
  9. 有人会认为指数下降就可以解决问题。但是,
  10. 这只会返回错误:ORA-8104“此索引对象 %s 正在联机构建或重建。”

  1. 解决方法是使用
  2. DBMS_REPAIR 包中的 ONLINE_INDEX_CLEAN 过程


  3. 解决问题:
  4. ==============

  5. SMON 最终会清除锁定的索引,因此实际上不需要任何操作。然而,让 SMON 进行清理可能会有点“碰巧”,因为 SMON 将尝试每 60 分钟清理一次,如果它无法使用 NOWAIT 锁定对象,它将稍后再试一次。在具有许多事务的高度活跃的数据库中,这可能导致重建需要很长时间,因为 SMON 不会通过 NOWAIT获得锁定。其他情况,如针对表的未提交事务也会导致 SMON 不重建索引。


  6. 只要不重建索引,对索引的所有访问都会导致 ORA-8104 或 ORA-8106。因此,为了解决这种情况,可以使用以下方法手动清理

  7. sqlplus / as sysdba

  8. DECLARE
  9.  isClean BOOLEAN;
  10. BEGIN
  11.  isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN();
  12. end;
  13. /

DBMS_REPAIR.ONLINE_INDEX_CLEAN 介绍:
此功能对失败或中断的在线索引构建或重建执行手动清理。
无论用户启动的清理如何,SMON 也会定期执行此操作 (批:听起来很感动,可实际可能不干活)。
如果所有指定的索引都已清除则返回TRUE;如果一个或多个索引无法清除,则此函数返回FALSE。



关于这个clean,还要注意一下:

  1. 建议在生产库上如下使用:
  2. select object_id from dba_objects where object_name='&idx_name';
  3. 假设得到的索引对象ID是76064,ORA-8104报错也会提示相关ID

  4. set serveroutput on
  5. DECLARE
  6.  isClean BOOLEAN;
  7. BEGIN
  8.  isClean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(76064);
  9.  dbms_output.PUT_LINE(sys.dbms_sqltcb_internal.i_convert_from_boolean(isClean));
  10. end;
  11. /
如果已经修复,再执行上面的语句则会报错:

在测试环境中可以不输入OBJECT_ID参数,就会把所有有问题的索引都修复一下。


阅读(2238) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~