Oracle ORA-14090 오류 원인과 해결 방법 완벽 가이드

ORA-14090
2026년 09월 22일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-14090 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-14090 cannot add partition when table has a DEFAULT partition 는?

ORA-14090 에러는 Oracle의 LIST 파티셔닝 또는 INTERVAL 파티셔닝된 테이블에 DEFAULT 파티션이 존재할 때, 새로운 파티션을 추가(ADD PARTITION)하려고 할 경우 발생하는 에러입니다. DEFAULT 파티션은 정의되지 않은 모든 값을 수용하는 특수한 파티션으로, 이미 DEFAULT 파티션이 존재하는 상태에서는 새로운 파티션을 추가할 수 없습니다. 이는 새로 추가하려는 파티션의 값이 이미 DEFAULT 파티션에 포함되어 있을 가능성이 있어 Oracle이 데이터 무결성 보호를 위해 이 작업을 차단하기 때문입니다.


주요 발생 원인

1. LIST 파티션 테이블에 DEFAULT 파티션이 존재하는 상태에서 ADD PARTITION 시도

LIST 파티셔닝에서 DEFAULT 파티션은 명시적으로 정의되지 않은 모든 값을 포함하는 파티션입니다. 이미 DEFAULT 파티션이 정의된 테이블에 새로운 LIST 파티션을 추가하려 하면 ORA-14090이 발생하며, 이는 새 파티션의 값 목록이 DEFAULT 파티션과 논리적으로 충돌하기 때문입니다.

-- 문제 상황 예시
CREATE TABLE sales_list (
    sale_id   NUMBER,
    region    VARCHAR2(20),
    amount    NUMBER
)
PARTITION BY LIST (region) (
    PARTITION p_seoul   VALUES ('SEOUL'),
    PARTITION p_busan   VALUES ('BUSAN'),
    PARTITION p_default VALUES (DEFAULT)  -- DEFAULT 파티션 존재
);

-- 아래 구문 실행 시 ORA-14090 발생
ALTER TABLE sales_list ADD PARTITION p_daegu VALUES ('DAEGU');
-- ORA-14090: cannot add partition when table has a DEFAULT partition

2. INTERVAL 파티션 또는 다른 파티션 전략에서 잘못된 파티션 관리

운영 중에 테이블 파티션 전략을 변경하거나, 기존 DEFAULT 파티션을 삭제하지 않고 새로운 파티션을 추가하려 할 때 이 에러가 발생합니다. 특히 장기간 운영된 레거시 시스템에서 파티션 구조를 정확히 파악하지 않고 DDL을 실행하는 경우 자주 발생합니다.

-- 현재 파티션 구조 확인 (실무 필수 사전 조회)
SELECT partition_name, 
       high_value, 
       partition_position,
       num_rows
FROM   user_tab_partitions
WHERE  table_name = 'SALES_LIST'
ORDER BY partition_position;

3. 파티션 재구성(SPLIT) 없이 바로 ADD PARTITION 수행

DEFAULT 파티션이 이미 일부 데이터를 포함하고 있는 상태에서, 해당 데이터를 새로운 파티션으로 이동시키지 않고 바로 ADD PARTITION을 시도하는 경우입니다. 이 경우 단순히 새 파티션을 추가하는 것이 아니라, SPLIT PARTITION을 이용해 DEFAULT 파티션을 분리하는 작업이 필요합니다.


해결 방법

해결책 1: SPLIT PARTITION을 사용하여 DEFAULT 파티션 분리

가장 권장되는 방법으로, DEFAULT 파티션에서 원하는 값을 분리하여 새로운 파티션을 생성합니다. 이 방법은 기존 데이터를 안전하게 유지하면서 파티션을 추가할 수 있습니다.

-- STEP 1: 현재 파티션 상태 확인
SELECT partition_name, high_value
FROM   user_tab_partitions
WHERE  table_name = 'SALES_LIST'
ORDER BY partition_position;

-- STEP 2: SPLIT PARTITION으로 DEFAULT에서 새 파티션 분리
ALTER TABLE sales_list
    SPLIT PARTITION p_default VALUES ('DAEGU')
    INTO (
        PARTITION p_daegu,       -- 새로 분리될 파티션
        PARTITION p_default      -- 나머지 DEFAULT 파티션
    );

-- STEP 3: 분리 후 파티션 상태 재확인
SELECT partition_name, high_value, num_rows
FROM   user_tab_partitions
WHERE  table_name = 'SALES_LIST'
ORDER BY partition_position;

해결책 2: DEFAULT 파티션 삭제 후 ADD PARTITION (데이터가 없는 경우)

DEFAULT 파티션에 실제 데이터가 없는 경우, DEFAULT 파티션을 먼저 삭제한 뒤 새로운 파티션을 추가하고 다시 DEFAULT 파티션을 생성하는 방법입니다.

-- STEP 1: DEFAULT 파티션에 데이터가 있는지 확인 (반드시 선행)
SELECT COUNT(*) FROM sales_list PARTITION (p_default);

-- STEP 2: 데이터가 없으면 DEFAULT 파티션 삭제
ALTER TABLE sales_list DROP PARTITION p_default;

-- STEP 3: 새로운 파티션 추가
ALTER TABLE sales_list ADD PARTITION p_daegu VALUES ('DAEGU');
ALTER TABLE sales_list ADD PARTITION p_incheon VALUES ('INCHEON');

-- STEP 4: DEFAULT 파티션 다시 추가
ALTER TABLE sales_list ADD PARTITION p_default VALUES (DEFAULT);

해결책 3: 여러 값을 한 번에 분리하는 SPLIT (다중 값 처리)

여러 파티션을 한 번에 처리해야 할 경우, SPLIT PARTITION을 반복적으로 사용하여 필요한 파티션을 모두 생성합니다.

-- 첫 번째 SPLIT: DAEGU 분리
ALTER TABLE sales_list
    SPLIT PARTITION p_default VALUES ('DAEGU')
    INTO (
        PARTITION p_daegu,
        PARTITION p_default
    );

-- 두 번째 SPLIT: INCHEON 분리
ALTER TABLE sales_list
    SPLIT PARTITION p_default VALUES ('INCHEON')
    INTO (
        PARTITION p_incheon,
        PARTITION p_default
    );

-- 결과 확인
SELECT partition_name, high_value
FROM   user_tab_partitions
WHERE  table_name = 'SALES_LIST'
ORDER BY partition_position;

예방 방법

1. 파티션 설계 단계에서 DEFAULT 파티션 사용 여부를 명확히 결정하고 문서화한다

테이블 파티션 전략을 수립할 때, DEFAULT 파티션의 사용 여부와 향후 파티션 추가 계획을 함께 문서화해야 합니다. DEFAULT 파티션이 필요한 경우, 향후 파티션 확장은 반드시 SPLIT PARTITION 방식으로만 수행하도록 운영 가이드에 명시하고 팀 전체가 숙지하도록 해야 합니다. 또한 아래와 같이 정기적으로 파티션 현황을 모니터링하는 스크립트를 스케줄링하는 것이 좋습니다.

-- 파티션 현황 주기적 점검 쿼리
SELECT table_name,
       partition_name,
       high_value,
       num_rows,
       last_analyzed
FROM   user_tab_partitions
WHERE  high_value = 'DEFAULT'
ORDER BY table_name;

2. DDL 실행 전 반드시 파티션 구조를 사전 검토하는 절차를 수립한다

운영 DB에서 파티션 관련 DDL을 실행하기 전, 반드시 현재 파티션 구조와 DEFAULT 파티션 존재 여부를 확인하는 검토 절차를 마련해야 합니다. 개발 및 스테이징 환경에서 먼저 테스트한 후, 운영 환경에 적용하는 Change Management 프로세스를 도입하면 이러한 에러를 사전에 방지할 수 있습니다.


관련 에러

  • ORA-14019: 파티션 경계값이 유효하지 않을 때 발생하며, LIST 파티션에서 중복된 값을 지정하거나 잘못된 경계값 설정 시 나타납니다.
  • ORA-14074: 새로 추가하려는 파티션의 경계값이 마지막 파티션의 경계값보다 작거나 같을 때 RANGE 파티션에서 발생합니다.
  • ORA-14308: 파티션 경계값이 파티션 키의 데이터 타입과 맞지 않을 때 발생하며, 파티션 DDL 작성 시 함께 주의해야 합니다.
  • ORA-14400: 삽입하려는 행이 어떤 파티션에도 매핑되지 않을 때 발생하며, DEFAULT 파티션 없이 LIST 파티션을 사용할 때 자주 나타납니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기