ORA-26026: 유일 인덱스는 처음과 같은 사용불가능한 상태입니다 (ORA-26026: unique index INDEX_NAME initially in unusable state)

'ORA-26026: 유일 인덱스가 처음부터 사용 불가능한 상태입니다'라는 메시지를 보신 적 있나요? 이번에 대용량 데이터를 로드하는 과정에서 갑자기 이 오류를 마주하게 되었는데요, 해결하는 방법에 대해 알아보도록 해요.

오류 메시지를 찬찬히 들여다보니 힌트는 역시 '인덱스'에 있었습니다. 결론부터 말하면, 고유 인덱스(unique index)가 UNUSABLE 상태로 남아 있어서 데이터 입력이 거부된 상황이었어요!

저의 경우, C#에서 오라클을 통해 Bulk Insert 기능을 사용해 엑셀에 있는 대량 데이터를 입력하던 중이었습니다. 그런데 중복이 존재할 수 없는 컬럼에 생성자의 실수로 중복 데이터가 들어 있었던 것이 문제의 원인이었죠.

단순히 인덱스를 리빌드하는 방법으로는 해결되지 않았고, 결국 유니크 인덱스를 기준으로 그룹핑하여 카운트를 확인하고 중복을 제거한 후 문제를 해결할 수 있었습니다.

다음은 'ORA-26026: unique index INDEX_NAME initially in unusable state'에 대한 일반적인 해결 방법이에요.

ORA-26026 오류 원인

이 오류의 핵심 원인은 간단합니다.

*일부 항목은 이번에 해결한 것과 관련이 없으나, 공식문서에서 확인할 수 있는 예외상황이랍니다.

  • 고유 인덱스가 UNUSABLE 상태로 설정되어 있음
  • Direct Path Insert나 SQL*Loader로 데이터를 적재하는 과정에서 인덱스 유지가 불가능한 상태
  • 무결성을 보장해야 하는 인덱스가 손상되었거나 rebuild 되지 않은 상태

즉, 인덱스가 정상적으로 동작하지 못하니 데이터 무결성을 유지할 수 없어서 오류를 발생시키는 것입니다.

인덱스 상태 확인

먼저 어떤 인덱스가 문제인지 확인합니다.

SELECT index_name, status 
FROM dba_indexes 
WHERE status = 'UNUSABLE';

파티션 인덱스라면 다음 쿼리를 사용합니다.

SELECT index_name, partition_name, status 
FROM dba_ind_partitions 
WHERE status = 'UNUSABLE';

인덱스 Rebuild

문제가 되는 인덱스를 다시 생성하면 오류를 해결할 수 있습니다.

ALTER INDEX 인덱스명 REBUILD;

파티션 인덱스라면 다음처럼 처리할 수 있습니다.

ALTER INDEX 인덱스명 REBUILD PARTITION 파티션명;

SQL*Loader를 사용할 경우

SQL*Loader를 활용해 데이터를 대량 적재하는 경우라면,
SKIP_INDEX_MAINTENANCE=TRUE 옵션을 설정할 수 있습니다.
이렇게 하면 데이터 적재 속도는 빨라지지만, 이후에는 반드시 인덱스를 다시 rebuild 해야 합니다.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗