分类: Oracle
2017-04-19 22:14:42
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; min-height: 13.0px}
--在建立索引的时候由于会话中断,导致oracle数据字典内已经包含了该索引的信息,但是却实际没有为该索引分配段,导致重新建立索引,并且删除索引报错,具体解决方式有两种:
一、擦除未建立成功的索引块
1.停止应用连接,否则删除则会报出该索引正在使用,无法被删除;
resource busy and acquire with NOWAIT specified
2.drop index xxxx --根据提示的index object 号清除该索引块的内容;
SQL> drop index ROOKIEORDER_IDX2;
drop index ROOKIEORDER_IDX2
*
ERROR at line 1:
ORA-08104: this index object 826976 is being online built or rebuilt
3.擦除索引块脚本,必须在sys用户下执行;
declar
done boolean;
begin
done:=dbms_repair.online_index_clean(826976);
end;
SQL> declare
2 done boolean;
3 begin
4 done:=dbms_repair.online_index_clean(826976);
5 end;
6 /
PL/SQL procedure successfully completed.
二、重启数据库也可以解决类似问题,如果是集群数据库,则代价更大,单实例则可以使用该方式;
--查询报错的索引块,快速定位是在哪个块报错;
Select g.sid,
g.SERIAL#,
g.TARGET,
g.SOFAR,
g.TOTALWORK,
g.START_TIME,
g.LAST_UPDATE_TIME,
s.SQL_TEXT,
s.DISK_READS,
s.BUFFER_GETS 分发时间
From v$session_longops g, v$sql s
Where g.SOFAR <> g.TOTALWORK
And s.SQL_ID = g.sql_id
--查询建立索引、重建索引的进度;
select sid,OPNAME,TARGET_DESC,sofar,TOTALWORK,trunc(sofar/totalwork*100,2)||'%' as perwork
from v$session_longops where sofar!=totalwork;