首页 > 数据库 >Oracle create index 中途取消后应该如何处理

Oracle create index 中途取消后应该如何处理

时间:2023-04-18 10:32:03浏览次数:47  
标签:index dbms being create 索引 flags online Oracle


        有时会遇到这样的情况,在创建索引的过程中啪叽网断了,会话中断;或者创建索引时觉得执行太慢,直接按了crtl+c取消,直接把运行窗口关了...尝试重新建索引的时候会遇到报错ORA-00095 索引名已存在,而drop index时又报错ORA-08104 this index is being online built or rebuilt

查看ORA-08104介绍

oerr ora 08104
08104, 00000, "this index object %s is being online built or rebuilt"
// *Cause:  the index is being created or rebuild or waited for recovering 
//          from the online (re)build 
// *Action: wait the online index build or recovery to complete

一、 报错原理

在进行online rebuild | create 时,Oracle 会修改如下信息:

  • 修改ind$中索引的flags,将该flags+512. 关于flags的含义,在下面进行说明。
  • 在该用户下创建一个临时日志表 (表名为sys_journal_<object_id>)来保存在创建或者重建索引期间产生的日志信息。

如果操作异常结束,而Oracle的SMON进程还没来得及清理journal table和ind$的flags标志位,系统会认为online (re)build操作还在执行,因此在drop索引时会报错 this index object %s is being online built or rebuilt

关于ind$中的flags字段

Flag字段的说明可以在ind$的sql.bsq脚本中找到:

/* mutable flags: anything permanent should go into property */
/* unusable (dls) : 0x01 */
/* analyzed : 0x02 */
/* no logging : 0x04 */
/* index is currently being built : 0x08 */
/* index creation was incomplete : 0x10 */
/* key compression enabled : 0x20 */
/* user-specified stats : 0x40 */
/* secondary index on IOT : 0x80 */
/* index is being online built : 0x100 */
/* index is being online rebuilt : 0x200 */
/* index is disabled : 0x400 */
/* global stats : 0x800 */
/* fake index(internal) : 0x1000 */
/* index on UROWID column(s) : 0x2000 */
/* index with large key : 0x4000 */
/* move partitioned rows in base table : 0x8000 */
/* index usage monitoring enabled : 0x10000 */

异常终止的情况下,可以发现ind$关于该索引的状态还是online rebuild的:

SQL> select obj#,flags from ind$ where obj#=67420;

OBJ# FLAGS
——— ———
67420 514

-- 514=0x202,表示该索引状态为index is being online rebuilt: 0x200 + analyzed: 0x02

在SMON完成清理动作后,再次查询索引状态已经恢复正常:

SQL> select obj#,flags from ind$ where obj#=67420;

OBJ# FLAGS
———- ———-
67420 2

二、 解决方法

1. 等待SMON进程清理

根据上面的原理,如果不着急的话,可以等待SMON进程自己去清理

2. 手动清理

首先查询问题索引的object_id

select object_id from dba_objects where object_name='YOUR_INDEX_NAME';

然后执行以下语句

declare
  isClean boolean;

begin
  isClean := FALSE;
  while isClean=FALSE loop
    isClean := dbms_repair.online_index_clean(查到的object_id,
                                              dbms_repair.lock_wait);
    dbms_lock.sleep(2);
  end loop;

  exception 
    when others then 
      RAISE; 
end;
/
  • dbms_repair.lock_wait表示不断寻找资源锁,直到抢到为止(如果一直占不到锁,可能会运行非常长时间)
  • 也可以指定 dbms_repair.all_index_id 清理所有问题索引
isClean := dbms_repair.online_index_clean(dbms_repair.all_index_id,
                                              dbms_repair.lock_wait);

取消一时爽,处理火葬场。对于大索引的online rebuild,不要轻易中止,否则可能要等上相当一段时间SMON才能完成清理工作,清理完后,可以在alert.log中看到如下记录:

User:,time:20071209 03:12:09,program:oracle@db1 (SMON),IP:,object:SYS_JOURNAL_67420,DDL: drop table “TAOBAO”.”SYS_JOURNAL_67420″

参考

ORA-600 [12813] When Dropping A Table Partition After a Failed IndexRebuild (文档 ID 803008.1)

http://www.ningoo.net/html/2007/dba_memo_online_rebuild_index_encounter_ora-08104.html

如何清除创建失败的索引_ITPUB博客

标签:index,dbms,being,create,索引,flags,online,Oracle
From: https://blog.51cto.com/u_13631369/6202566

相关文章

  • Oracle 单进程可用PGA为4G限制导致的ORA-4030报错
    一、问题背景收到开发反馈,系统报表运行过程中报错,一看发现是ORA-4030,内存的问题查看alert日志,发现期间有大量ORA-4030报错,并且主要是pga相关的打开trace文件,可以看到报错进程使用内存接近4G但是查看pga参数设置,发现设置的上限是20G,完全没到,并且期间总的PGA使用率也不高 二、报错......
  • Oracle 常规坏块处理方法
    收到业务反馈,查看erp请求时遇到报错,一看居然是坏块。。。-_-|| alert日志中也出现相关报错,但还好只有一个坏块一、有备份的处理方法这一般就非常简单,rman有坏块修复功能Recoverdatafile19block44;如有必要,可同时修复多个文件多个块Recoverdatafile19block44datafile19......
  • Oracle 列由VARCHAR2改为CLOB类型
    最近突然遇到好多Oracle列由VARCHAR2改为CLOB类型的需求,不知道大家是不是约好了。。。查了一些网上的文章,结合实际修改的情况记录一下各种场景及解决方法。 一、示例准备新建两张表TB_WITHOUT_DATA(VARCHAR2列不包含数据)和TB_WITH_DATA(Varchar2列包含数据)createtableTB_WITHOU......
  • Oracle将想要查询的时间点集合作为一个新表,去另一个表里只查询规定时间点的数据
    最近遇到一个新需求,我们需要在一个表中选取特定时间段内一些固定时间点的数据(比如只想要取每个小时零点的数据),废物的我想不出来,让大佬教的,记录一下。假如这个表长这样,名字就叫Table吧,需要取到每个小时零点的高度 TIMEHEIGHT2023-04-1800:00:0012023-04-1801:00......
  • wangeditor5 vue2 安装后运行报错 Error in ./node_modules/@wangeditor/editor/d
    问题解决方法:原因就是引入的链接不对,使用cnpm、npm、pnpm、yarn安装插件的时候,路径都是不一样的,所以要对应着改路径就可以了链接:https://github.com/wangeditor-team/wangEditor/issues/4041......
  • Oracle Recovery Tools快速恢复断电引起的无法正常启动数据库---惜分飞
    由于异常断电,数据库启动报错ORA-01113和ORA-01110,ORA-00322和ORA-00312以及ORA-00314和ORA-00312错误MonApr1709:35:042023ALTERDATABASEOPENErrorsinfileD:\APP\ADMINISTRATOR\diag\rdbms\orcl\orcl\trace\orcl_ora_10192.trc:ORA-01113:文件1需要介质恢......
  • 实时Oracle 监控和性能分析工具
    概述 MyOra是一种先进的Oracle数据库监控工具,具有最快的响应时间并提供对Oracle数据库的即时可见性。该工具简单、快速且易于使用,无需安装,无需Oracle客户端,也无需互联网连接。下载MyOra并实时监控数据库性能。也可将MyOra用作DBA工具或SQL查询工具。   ......
  • Oracle:centos9 安装 oracle11g
    比较简单。关键点:ln-s/usr/lib64/libnsl.so.1   /usr/lib64/libnsl.soln-sf/u01/app/oracle/product/11.2.0/dbhome_1/lib/stubs/libaio.so.1  /usr/lib64/libaio.so.1vi/u01/app/oracle/product/11.2.0/dbhome_1/sysman/lib/ins_emagent.mk (emdctl:添加-......
  • oracle如何同时往主外键表中插入值
    a(ID1,name,sex)b(ID2,ID1,Fraction)ID1,ID2同为自动增长ID1为b表的外键参照a表的ID11、先创建a和b表的序列CREATESEQUENCESEQ_A;CREATESEQUENCESEQ_B;2、插入A表并返回A表当前IDv_id1number(20);insertintoa(ID1,name,sex)values(SEQ_A.NEXTVAL,name_value......
  • oracle登录
    oracle登录允许错误次数设置一般数据库默认是10次尝试失败后锁住用户1、查看FAILED_LOGIN_ATTEMPTS的值select*fromdba_profiles2、修改为30次alterprofiledefaultlimitFAILED_LOGIN_ATTEMPTS30;3、修改为无限次(为安全起见,不建议使用)alterprofi......