2026년 07월 12일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01418 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01418 specified index does not exist 는?
ORA-01418 에러는 Oracle 데이터베이스에서 존재하지 않는 인덱스를 참조하거나 조작하려 할 때 발생하는 오류입니다. 주로 ALTER INDEX, DROP INDEX, REBUILD INDEX 등의 DDL 명령어를 수행할 때, 해당 인덱스가 현재 스키마 또는 지정된 스키마에 존재하지 않을 경우 Oracle 엔진이 이 에러를 반환합니다. 인덱스 이름 오타, 스키마 혼동, 또는 이미 삭제된 인덱스에 대한 접근이 대표적인 원인으로, 30년 DBA 경력 동안 개발자와 DBA 모두에게서 빈번하게 목격한 실수 중 하나입니다.
주요 발생 원인
1. 인덱스 이름 오타 또는 대소문자 불일치
Oracle은 기본적으로 데이터베이스 오브젝트 이름을 대문자로 저장합니다. 따라서 인덱스를 생성할 때 따옴표(큰따옴표)를 사용하지 않았다면 내부적으로 대문자로 저장되며, DROP INDEX idx_name 처럼 소문자로 명령을 입력해도 Oracle이 자동으로 대문자로 변환하므로 문제가 없습니다. 그러나 큰따옴표로 생성된 인덱스("idx_name")는 반드시 정확한 대소문자와 함께 큰따옴표를 사용해야만 인식되므로, 이를 놓쳤을 때 ORA-01418이 발생합니다.
2. 잘못된 스키마(소유자) 지정
여러 스키마가 존재하는 운영 환경에서는 인덱스 이름 앞에 스키마명을 명시해야 하는 경우가 많습니다. 현재 세션의 기본 스키마와 인덱스가 실제로 속한 스키마가 다를 때, 스키마 접두어를 생략하거나 잘못 입력하면 Oracle은 해당 인덱스를 찾지 못하고 ORA-01418을 반환합니다. 특히 DBA 계정으로 다른 사용자의 오브젝트를 관리할 때 자주 발생하는 패턴입니다.
3. 인덱스가 이미 삭제되었거나 아직 생성되지 않은 상태
배포 스크립트나 마이그레이션 작업 중, 이미 삭제된 인덱스에 대해 DROP 또는 REBUILD 명령을 재실행하거나, 아직 생성되지 않은 인덱스를 ALTER 하려 할 때 발생합니다. 자동화 스크립트에서 멱등성(Idempotency)을 확보하지 않으면 CI/CD 파이프라인이나 배포 자동화 환경에서 이 에러로 인해 전체 스크립트가 실패하는 상황이 빈번하게 발생합니다.
해결 방법
1단계: 인덱스 존재 여부 먼저 확인
문제를 해결하기 전에 반드시 해당 인덱스가 실제로 존재하는지, 어떤 스키마에 속하는지 확인해야 합니다.
-- 현재 사용자 소유의 인덱스 조회
SELECT index_name, table_name, status, index_type
FROM user_indexes
WHERE index_name = 'IDX_EMP_DEPTNO';
-- 전체 스키마에서 인덱스 조회 (DBA 권한 필요)
SELECT owner, index_name, table_name, status
FROM dba_indexes
WHERE index_name = 'IDX_EMP_DEPTNO';
-- 인덱스 이름을 정확히 모를 때 LIKE 검색
SELECT owner, index_name, table_name
FROM dba_indexes
WHERE index_name LIKE '%EMP%'
ORDER BY owner, index_name;
2단계: 스키마 접두어 확인 및 수정
-- 잘못된 예: 스키마 지정 없이 다른 사용자의 인덱스 삭제 시도
DROP INDEX idx_emp_deptno; -- ORA-01418 발생 가능
-- 올바른 예: 스키마(소유자) 명시
DROP INDEX hr.idx_emp_deptno;
-- 올바른 예: ALTER INDEX 시 스키마 명시
ALTER INDEX hr.idx_emp_deptno REBUILD;
3단계: 큰따옴표로 생성된 인덱스 처리
-- 큰따옴표로 생성된 인덱스 (소문자 이름 유지됨)
CREATE INDEX "idx_emp_deptno" ON hr.employees(department_id);
-- 반드시 큰따옴표와 정확한 대소문자로 참조해야 함
DROP INDEX hr."idx_emp_deptno";
-- 잘못된 예: 따옴표 없이 참조 시 ORA-01418 발생
DROP INDEX hr.idx_emp_deptno; -- ORA-01418!
4단계: 배포 스크립트에서 안전하게 인덱스 삭제 (멱등성 확보)
-- PL/SQL을 이용한 안전한 인덱스 삭제
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM user_indexes
WHERE index_name = 'IDX_EMP_DEPTNO';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP INDEX idx_emp_deptno';
DBMS_OUTPUT.PUT_LINE('INDEX idx_emp_deptno 삭제 완료');
ELSE
DBMS_OUTPUT.PUT_LINE('INDEX idx_emp_deptno 가 존재하지 않아 삭제를 건너뜁니다.');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
END;
/
5단계: 인덱스 상태(UNUSABLE) 확인 및 REBUILD
-- UNUSABLE 상태의 인덱스 조회
SELECT index_name, status
FROM user_indexes
WHERE status = 'UNUSABLE';
-- UNUSABLE 인덱스 재구성
ALTER INDEX hr.idx_emp_deptno REBUILD ONLINE;
-- 파티션 인덱스의 경우
ALTER INDEX hr.idx_emp_deptno REBUILD PARTITION part_2024;
예방 방법
1. 모든 DDL 스크립트에 존재 여부 체크 로직 추가
운영 환경의 배포 스크립트, 마이그레이션 스크립트에는 반드시 인덱스 존재 여부를 확인하는 PL/SQL 블록을 앞에 추가하는 것을 팀 표준으로 정착시키세요. 이를 통해 재실행 가능한(Rerunnable) 스크립트를 만들 수 있으며, 자동화 배포 시 불필요한 에러로 인한 롤백을 방지할 수 있습니다. 특히 CI/CD 파이프라인에서는 에러 발생 시 전체 배포가 중단될 수 있으므로 멱등성 확보가 필수입니다.
2. 인덱스 네이밍 컨벤션 표준화 및 큰따옴표 사용 금지
팀 또는 조직 차원에서 인덱스 이름에 큰따옴표를 사용하지 않는 것을 컨벤션으로 정하고, IDX_테이블명_컬럼명 형태의 일관된 네이밍 규칙을 적용하세요. 큰따옴표 인덱스는 대소문자 민감성으로 인해 관리 복잡도를 높이고 ORA-01418과 같은 에러의 원인이 됩니다. 정기적으로 DBA_INDEXES 뷰를 조회하여 네이밍 컨벤션을 위반하는 인덱스를 점검하고 정리하는 습관을 갖는 것이 좋습니다.
관련 에러
- ORA-01408: 해당 컬럼 목록에 이미 인덱스가 존재할 때 발생 (
such column list already indexed) - ORA-00942: 테이블 또는 뷰가 존재하지 않을 때 발생하며, 인덱스 생성 대상 테이블이 없는 경우 함께 나타날 수 있음
- ORA-01502: 인덱스 또는 인덱스의 파티션이 UNUSABLE 상태일 때 발생하며, ORA-01418과 혼동되기 쉬운 인덱스 관련 에러
- ORA-02429: 유니크 제약 조건을 강제하는 인덱스를 삭제할 수 없을 때 발생 (
cannot drop index used for enforcement of unique/primary key)
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.