현상
인덱스 온라인 빌드 실패 후 리빌드 시, 7249 에러가 발생합니다.
참고
TBR-7249: The index is being built or rebuilt.
현상 발생 시나리오
--현상 발생을 위한 테이블, 인덱스, 데이터 생성
SQL>
DROP TABLE T PURGE;
CREATE TABLE T( C1 NUMBER, C2 VARCHAR2(10), C3 VARCHAR2(20) );
INSERT INTO T
SELECT LEVEL C1
, '2014'||(LPAD(TRUNC(DBMS_RANDOM.VALUE(1,12)), 2,'0'))||(LPAD(TRUNC(DBMS_RANDOM.VALUE(1,30)), 2,'0')) C2
, 'TEST'|| LEVEL
FROM DUAL
CONNECT BY LEVEL <= 5000000;
COMMIT;
CREATE INDEX IDX_T ON T(C1, C2);
--7249 에러 발생을 위한 인덱스 리빌드 실패 시나리오
--rebuild 온라인 수행 후 약 5초 뒤 수행 취소 (Ctrl+c) 진행
SQL> ALTER INDEX IDX_T REBUILD ONLINE;
^C
Trying to cancel the current statement by user's request.
TBR-12040: Statement canceled.
--인덱스 리빌드 재수행 → TBR-7249 에러 발생되어 인덱스 리빌드 실패됨
SQL> ALTER INDEX IDX_T REBUILD ONLINE;
TBR-7249: Index 'IDX_T' is being built or rebuilt.
SQL
복사
원인
인덱스 온라인 빌드 실패 시 journal table이 삭제되지않고 존재하여 7429 에러가 발생합니다.
BMS_REPAIR 수행 대상 오브젝트 조회
--rebuild 중인 인덱스 오브젝트 조회
SQL>
SELECT * FROM SYS._DD_IDXRE;
OBJ_ID SGMT_ID PCTFREE_BYTES INITRANS FLAGS
---------- ---------- ------------- ---------- ----------
173705 173708 819 2 0
--온라인 옵션으로 생성한 인덱스 오브젝트 조회
SQL>
SELECT * FROM SYS._DD_IDXON;
OBJ_ID TYPE_NO FLAGS
---------- ---------- ----------
173705 1 0LAGS
--위의 내용을 종합하여 DBMS_REPAIR 패키지 수행이 필요한 인덱스 이름 조회
SQL>
SELECT A.OWNER, A.OBJECT_NAME, A.OBJECT_TYPE, C.TABLE_NAME
FROM DBA_OBJECTS A, SYS._DD_IDXRE B, DBA_INDEXES C
WHERE A.OBJECT_ID=B.OBJ_ID
AND A.OBJECT_NAME=C.INDEX_NAME
AND A.OWNER=C.OWNER;
OWNER OBJECT_NAM OBJECT_TYP TABLE_NAME
---------- ---------- ---------- ------------------------------
TIBERO IDX_T INDEX T
SQL
복사
해결
journal table을 삭제하는 drop 절차를 수행합니다.
1.
journal table 삭제 스크립트 수행
SQL>
set serveroutput on
DECLARE
cleaned BOOLEAN;
BEGIN
cleaned := false;
WHILE cleaned = false
LOOP
cleaned := DBMS_REPAIR.ONLINE_INDEX_CLEAN(DBMS_REPAIR.ALL_INDEX_ID,
DBMS_REPAIR.LOCK_WAIT);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE );
DBMS_OUTPUT.PUT_LINE('SQL MESSAGE: ' || SQLERRM(SQLCODE));
END;
/
PSM completed.
SQL
복사
2.
인덱스 오브젝트 조회
스크립트 수행 후 이전에 수행했었던 인덱스 오브젝트를 조회합니다.
SQL> SELECT * FROM SYS._DD_IDXRE;
0 row selected.
SQL> SELECT * FROM SYS._DD_IDXON;
0 row selected.
SQL
복사
3.
인덱스 온라인 리빌드 수행
이후, 인덱스 온라인 리빌드 수행하여 정상 수행되는지 확인합니다.
SQL> ALTER INDEX IDX_T REBUILD ONLINE;
Index 'IDX_T' altered.
SQL
복사
참고
DBMS_REPAIR 패키지 수행 시 락 점유 하므로, DML 부하가 적은 시간대에 수행할 것을 권장합니다.