ORA-08104

https://blog.csdn.net/daiqiulong2

create index idx_p_merchant_detail_id on D_ORDER_DETAIL (merchant_detail_id) Online;

创建好长时间,没有反映;然后取消,结果删除索引的时候,报如下的错误:

错误:ORA-08104: this index object 67420 is being online built or rebuilt

通过 ONLINE 参数创建索引(或者重建索引), 如果进程被突然终止,或者是手工 CTRL+C 取消该操作,
在非常个别的时候,麻烦来了。重新创建索引,会告诉你该索引已经存在,drop index ,会告诉你该索
引被锁,或者是 ORA-08104(this index object xxxxx is being online built or rebuilt) 错误。

该过程失败之前创建的一些临时对象由 SMON 负责清除,糟糕的是, SMON 可不是那么听话,马上出来清除,
这个清除时间可能会很长,据说在 9i 上观察是 2 个小时才清除掉。

如何解决呢?
在Oracle10g之前,对于这种情况没有太好的办法,只有等SMON进程来进行清理了。网上有说上重启库可以解决,
有说直接update系统表ind$的,对于不能停机的产品库来说,这些都是不可取的方案。重启不现实,修改系统表
更是DBA的大忌。

最好是等系统自动清除,如果因此给你带来的影响让你不得不手动尽早清除的话,那就看你的运气了
如果是Oracle10g,则可以使用dbms_repair.online_index_clean手工清理(metalink的说法,9i打了Bug 3805539的patch的话也能用该过程了)。

如果是一个比较繁忙的 OLTP 系统, 并且是要维护单列索引,那么风险真的是很大的。在 SMON 清除这些临
时对象之前,没有办法在该列上建立新的索引。服务器能撑住么?

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

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

OBJ#      FLAGS
---------- ----------
     67420        514

Flags字段的说明可以在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 */

514=0×202,表示该索引状态为index is being online rebuilt : 0×200 + analyzed : 0×02

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

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

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

清理完后,可以在alert.log中看到如下记录:

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

解决一:

在10g中用dbms_repair.online_index_clean来清除创建索引的失败的遗留

DECLARE 
  RetVal BOOLEAN;
  OBJECT_ID BINARY_INTEGER;
  WAIT_FOR_LOCK BINARY_INTEGER;

BEGIN 
  OBJECT_ID := 67420;
--  我的数据库中非法索引的id为67420.
  WAIT_FOR_LOCK := NULL;

RetVal := SYS.DBMS_REPAIR.ONLINE_INDEX_CLEAN ();
  COMMIT; 
END; 
/

注意:dbms_repair.online_index_clean这个函数一定要有返回值,否则会失败的

解决二:(这种方法没测试成功)

唤醒SMON:

WAKEUP command  :To wake up a process use

ORADEBUG WAKEUP pid

For example to wake up SMON, first obtain the PID using

SELECT pid FROM v$process
    WHERE addr = 
    (
        SELECT paddr FROM v$bgprocess
        WHERE name = ‘SMON‘
    );

If the PID is 6 then send a wakeup call using

sql > ORADEBUG WAKEUP 6

记录一下SMON的功能及其触发频率(9i):

Merging free extents or coalescing: every five minutes.

Cleaning up temporary segments: every two hours.

Updating SMON_SCN_TIME for used in time based flashback: every five minutes.

Cleaning up non existent objects in OBJ$: every 12 hours.

Cleaning up IND$ if online builder crashes: every hour.

Shrink undo segments:every 12 hours.

Transaction recovery only on startup.

Transaction rollback of dead transaction when posted by PMON, allowing the use of fast start parallel rollback if necessary.

解决方法三:

由于在做索引在线重建的时候,可能相关的表还在变化,Oracle需要记录这个索引的相关变化,因此Oracle会创建一张临时表来记录这些变化,等索引重建完成后再删除这张临时表,这张临时表的名字为SYS_JOURNAL_<INDEX的OBJECT_ID>。REBUILD ONLINE刚刚开始的时候就会去创建这张日志表,但是如果创建日志表的时候,发现这张表已经存在了,就可能会报ORA-8104,并无法继续做REBUILD ONLIE(普通的REBUILD会检查索引的FLAG标志和这张表,如果冲突,也会失败)。如果REBUILD ONLINE被中途杀掉了,那么这张表和IND$中的FLAGS不会被自动清除,必须由SMON来清除。而SMON每个小时会进行一次类似的清除工作,SMON做清除前首先要锁住日志表,如果这个索引相关的表还在变化,那么SMON可能无法锁住这张表,如果SMON锁表失败,就会放弃这次清理工作,等一个小时后再来清理。这样一来,在业务较为繁忙的生产系统上,可能SMON永远都没有机会清除这张日志表。

如果是9i的数据库就很麻烦了,如果系统smon进程无法清除,或者重启数据库也无法解决,那只有手工清除了日志表,并且修改索引的FLAGS。手工解决这个问题分为两个步骤:

1、手工删除日志表:

首先找到这个索引的OBJECT_ID:

Select object_id from dba_objects where owner=<owner> and object_name=<index name>;

找到OBJECT_ID后,就可以知道表的名字了(SYS_JOURNAL_<OBJECT_ID>),直接DROP这张表。不过如果这张表上的DML比较频繁,DROP操作可能不会一次成功,需要不停的重试。

2、手工修改IND$:

UPDATE IND$ SET FLAGS=FLAGS-512 WHERE OBJ#=<OBJECT_ID>;

手工清理要十分小心,一旦出错会导致数据字典错误。

解决方法四:

还有一种稳妥的办法是把应用停了,然后重启数据库,这样相关表上没有了DML操作,很快SMON就会完成自动清理。

参考文档:http://www.oraclefans.cn/forum/showtopic.jsp?rootid=14720&CPages=1

http://blog.csdn.net/wyzxg/article/details/4318618

原文地址:https://www.cnblogs.com/chendian0/p/10409843.html

时间: 2024-11-09 03:58:23

ORA-08104的相关文章

讨厌麻烦的ora 01722无效数字

webservice开发过程中,数据库由原来的oracle改为现在的sql server.然后重新调试,结果报出ora 01722无效数字的错误. 由于连接oracle数据库的时候并没有问题,所以一开始我以为是数据库不同,导致部分数据类型差异,(但又觉得有点离谱,切换数据库,不至于会导致这种错误吧) 经过排查,总结得出如下: 1.对于两个类型不匹配(一个数字类型,一个非数字类型,同下)的值进行赋值操作;2.两个类型不匹配的值进行比较操作(例如,"=");3.to_number函数中的值

ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)

不论是单实例还是RAC,对于非缺省端口下(1521)的监听器,pmon进程不会将service/instance注册到监听器,即不会实现动态注册.与单实例相同,RAC非缺省端口的监听器也是通过设置参数local_listener来达到目的.除此之外,还可以对实例进行远程注册,以达到负载均衡的目的.这是通过一个参数remote_listener来实现. 有关Oracle 网络配置相关基础以及概念性的问题请参考:      配置ORACLE 客户端连接到数据库   配置非默认端口的动态服务注册   

oerr ora 000845解决方法是扩大/dev/shm空间

打开虚拟机发现实例起不来 [[email protected] ~]# su - oraclesq[[email protected] ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Tue Aug 2 14:59:54 2016 Copyright (c) 1982, 2013, Oracle.  All rights reserved. Connected to an idle instance. [ema

tnsnames.ora文件说明

目录位置 unix:$ORACLE_HOME/network/admin WINDOW:%ORACLE_HOME%\network\admin 设置相应的环境变量:TNS_ADMIN tnsname.ora文件内容例子 --负载均衡,故障转移 sample2= (DESCRIPTION= (LOAD_BALANCE=on) (FAILOVER=on) (ADDRESS_LIST= (SOURCE_ROUTE=yes) (ADDRESS=(PROTOCOL=tcp)(HOST=host1)(POR

在TNSNAMES.ORA文件中配置本机装的oracle

首先,感谢这两位网友:http://zhidao.baidu.com/link?url=eGYeoEa-EhQdVitSGqjE36uNfVmEsryXH1WUjPue6YvArDSx-Y1N9_rd9Hx6vh-NklyevkcCtAMh1X28fI1Hoq 引子: 我在Oracle SQL Developer工具中创建了一个名为"oa"的连接,然后登陆PLSQL Developer,从本地导入一张表"T_DEPT",打开Oracle SQL Developer,

ALERT.LOG for ASM Shows &quot;WARNING: failed to online diskgroup resource ora.GI.dg (unable to communica

APPLIES TO: OracleDatabase - Enterprise Edition - Version 11.2.0.1 to 12.1.0.1 [Release 11.2 to12.1] Informationin this document applies to any platform. ***Checked for relevance on 03-Jul-2013*** SYMPTOMS If OCR is located on ASM diskgroup, followin

安装了多个Oracle11g的客户端,哪个客户端的tnsnames.ora会起作用?

如果我们由于需要安装了多个Oracle的client,哪个客户端的tnsnames.ora会起作用呢? 答案是: 在安装好clinent端后,安装程序会把client的bin目录放到path里面,path中在前面的client会被首先搜索,其中的tnsnames.ora会起作用,后面的clinent就不起作用了. %ORACLE_HOME%\bin下面有一个oracle.key,指定用注册表中的哪一个oraclehome,注册表中的每一个oraclehome包含了所有的设置,包括NLS_LANG

oracle instant client,tnsping,tnsnames.ora和ORACLE_HOME

前段时间要远程连接oracle数据库,但是又不想在自己电脑上完整安装oracle客户端,于是到oracle官网下载了轻量级客户端instant client.这玩意没有图形界面,全靠sqlplus远程连接服务器,所以不占地方,正好满足我这种追求"简单就好"的强迫症患者需求. 但是呢,可能是服务器那边没开监听端口,我在自己的机子上尝试了各种配置,包括tnsnames.ora,sqlnet.ora等,远程连接均告失败.为了排查问题,我先ping了一下服务器的外网地址,发现没问题.网上说,光

expdp报错ora 39126

11.2.0.2,expdp报错: ORA-39126: Worker unexpected fatal error in KUPW$WORKER.GET_TABLE_DATA_OBJECTS []ORA-31642: the following SQL statement fails:BEGIN "SYS"."DBMS_CUBE_EXP".SCHEMA_CALLOUT(:1,0,1,'11.02.00.00.00'); END;ORA-06512: at &quo

Oracle配置文件tnsnames.ora新增链接后连接报错:ORA-12154: TNS:无法解析指定的标识符

另一个空格引发的血案竟然也被我碰到了:在tnsnames. ora文件中新加了一个配置,该配置估计当时是拷的别人的直接粘贴上去的,然后发现用pl/sql连接就一直报错了,后面排除了用户名和密码问题和后,仔细看了该文件才发现新加的配置第一行WLF前多了个不起眼的空格: WLF= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONTENT_DATA = (S