프린트 하기

OS환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.15.0.0

 

에러 : ORA-08104: this index object is being online built or rebuilt

alter index rebuild online 명령으로 인덱스를 온라인 리빌드 하다가 강제로 종료할 경우

인덱스가 제대로 리빌드 되지 않은 상태로 남아 이후 리빌드 명령을 재수행 할 때 에러가 발생할 수 있음

1
2
3
SQL> alter index imsi.ix_ntable_01 rebuild online;
...
작업중 Ctrl + C로 취소

 

 

인덱스 리빌드 재시도

1
2
3
SQL> alter index imsi.ix_ntable_01 rebuild online;
*
ORA-08104: this index object imsi.ix_ntable_01 is being online built or rebuilt

에러 발생함

 

 

해결 방법 : DBMS_REPAIR.ONLINE_INDEX_CLEAN 수동 실행 또는 대기

일반적으로 이런 문제가 발생한 경우 SMON에 의해 1시간에 한번씩 정리가 됨

그렇기 떄문에 당장 리빌드를 다시 해야하는게 아니라면 기다리면 자동으로 해소가 됨

 

만약 당장 리빌드를 해야하는 경우에는 DBMS_REPAIR.ONLINE_INDEX_CLEAN 를 사용해서 수동으로 인덱스 리빌드중 발생한 찌꺼기?를 제거해줄 수 있음

sys 유저로 접속 후 아래 명령 수행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> 
set serveroutput on
declare
  result boolean := false;
begin
  result := dbms_repair.online_index_clean();
  if result then
    dbms_output.put_line('result= True');
  else
    dbms_output.put_line('result= False');
  end if;
end;
/
 
result= True
 
PL/SQL procedure successfully completed.

dbms_repair.online_index_clean 프로시저가 정상적으로 수행되었다면 result= True 로 표시됨

 

 

이후 인덱스 리빌드 재시도

1
2
3
SQL> alter index imsi.ix_ntable_01 rebuild online;
 
Index altered.

정상적으로 리빌드됨

 

 

원인 : 세션 비정상 종료로 인한 데이터 딕셔너리 미정리

online 인덱스 리빌드 중 세션 오류가 발생하면 실제로는 리빌드가 진행 중이 아닌데도

리빌드가 진행 중임을 반영하는 상태로 딕셔너리에 남아 있을 수 있음

이 경우 위 방법을 통해 딕셔너리를 clean 시켜줘야함

 

 

참조 : 

375856.1, 272735.1
https://kosate.tistory.com/64
https://dev-road.tistory.com/25
https://dbaclass.com/article/ora-08104-this-index-object-is-being-online-built-or-rebuilt/