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

ORA-14021
2026년 09월 20일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-14021 MAXVALUE must be specified for all columns 는?

ORA-14021 에러는 Oracle 파티션 테이블에서 RANGE 파티셔닝을 구성할 때, 복합 파티션 키(Composite Partition Key)를 사용하는 경우 MAXVALUE를 모든 컬럼에 대해 지정하지 않았을 때 발생하는 에러입니다. Oracle은 RANGE 파티셔닝에서 마지막(또는 특정) 파티션의 상한값으로 MAXVALUE를 사용할 때, 복합 키를 구성하는 모든 컬럼에 MAXVALUE를 명시해야 한다는 규칙을 강제합니다. 즉, 복합 파티션 키 중 일부 컬럼에만 MAXVALUE를 지정하고 나머지 컬럼에는 일반 값을 입력하면 이 에러가 발생합니다.


주요 발생 원인

1. 복합 RANGE 파티션 키에서 일부 컬럼에만 MAXVALUE 지정

가장 흔하게 발생하는 원인입니다. 파티션 키가 두 개 이상의 컬럼으로 구성된 복합 키일 때, MAXVALUE를 첫 번째 컬럼에만 지정하고 두 번째 컬럼에는 실제 값을 입력하는 실수가 발생합니다. Oracle의 파티셔닝 규칙상 MAXVALUE는 해당 파티션 키의 “상한 없음”을 의미하므로, 첫 번째 컬럼이 이미 MAXVALUE인 상태에서 두 번째 컬럼에 특정 값을 지정하는 것은 논리적으로 모순이기 때문에 Oracle은 이를 허용하지 않습니다.

2. RANGE-RANGE 또는 RANGE-HASH 복합 파티션(Composite Partitioning) 정의 오류

Oracle 11g 이상에서 지원하는 복합 파티셔닝(Composite Partitioning) 구성 시, 상위(Main) 파티션 레벨에서 복합 키의 MAXVALUE 지정을 누락하면 에러가 발생합니다. RANGE-RANGE, RANGE-LIST 등의 조합에서 서브파티션과 메인파티션의 경계값을 정의할 때 실수가 많이 발생하며, 특히 기존 파티션 테이블에 새 파티션을 ALTER TABLE ... ADD PARTITION 구문으로 추가할 때 이 규칙을 간과하기 쉽습니다.

3. 파티션 SPLIT 또는 파티션 추가 시 MAXVALUE 혼용 오류

기존에 MAXVALUE로 정의된 파티션을 SPLIT PARTITION 구문으로 분할하거나, ADD PARTITION으로 새 파티션을 추가할 때 복합 키의 경계값(Bound Value)을 잘못 혼합하는 경우에도 이 에러가 발생합니다. 예를 들어 (MAXVALUE, 100) 형태처럼 첫 번째 컬럼은 MAXVALUE이고 두 번째 컬럼에 일반 숫자 값을 넣는 경우가 대표적이며, 이는 운영 중인 테이블의 파티션 관리 작업에서 자주 목격됩니다.


해결 방법

원인 1 해결: 복합 RANGE 파티션 키 전체에 MAXVALUE 지정

잘못된 예시 (에러 발생):

-- 복합 키 (SALE_YEAR, SALE_MONTH)를 사용하는 파티션 테이블
CREATE TABLE sales_data (
    sale_id     NUMBER,
    sale_year   NUMBER,
    sale_month  NUMBER,
    amount      NUMBER
)
PARTITION BY RANGE (sale_year, sale_month) (
    PARTITION p_2022 VALUES LESS THAN (2022, 12),
    PARTITION p_2023 VALUES LESS THAN (2023, 12),
    -- 에러 발생: 첫 번째 컬럼에만 MAXVALUE 지정
    PARTITION p_max  VALUES LESS THAN (MAXVALUE, 12)
);
-- ORA-14021: MAXVALUE must be specified for all columns

올바른 예시 (에러 해결):

-- 복합 키의 모든 컬럼에 MAXVALUE 지정
CREATE TABLE sales_data (
    sale_id     NUMBER,
    sale_year   NUMBER,
    sale_month  NUMBER,
    amount      NUMBER
)
PARTITION BY RANGE (sale_year, sale_month) (
    PARTITION p_2022 VALUES LESS THAN (2022, 12),
    PARTITION p_2023 VALUES LESS THAN (2023, 12),
    -- 모든 컬럼에 MAXVALUE 지정 (올바른 방법)
    PARTITION p_max  VALUES LESS THAN (MAXVALUE, MAXVALUE)
);

원인 2 해결: 복합 파티셔닝(Composite Partitioning) 정의 수정

잘못된 예시 (에러 발생):

-- RANGE-LIST 복합 파티션에서 MAXVALUE 누락
CREATE TABLE orders (
    order_id    NUMBER,
    order_year  NUMBER,
    order_month NUMBER,
    region      VARCHAR2(20)
)
PARTITION BY RANGE (order_year, order_month)
SUBPARTITION BY LIST (region) (
    PARTITION p_2023 VALUES LESS THAN (2023, 6)
        (SUBPARTITION p_2023_east VALUES ('EAST'),
         SUBPARTITION p_2023_west VALUES ('WEST')),
    -- 에러: 두 번째 컬럼에 일반값 혼용
    PARTITION p_max VALUES LESS THAN (MAXVALUE, 12)
        (SUBPARTITION p_max_east VALUES ('EAST'),
         SUBPARTITION p_max_west VALUES ('WEST'))
);
-- ORA-14021 발생

올바른 예시 (에러 해결):

-- 모든 파티션 키 컬럼에 MAXVALUE 적용
CREATE TABLE orders (
    order_id    NUMBER,
    order_year  NUMBER,
    order_month NUMBER,
    region      VARCHAR2(20)
)
PARTITION BY RANGE (order_year, order_month)
SUBPARTITION BY LIST (region) (
    PARTITION p_2023 VALUES LESS THAN (2023, 6)
        (SUBPARTITION p_2023_east VALUES ('EAST'),
         SUBPARTITION p_2023_west VALUES ('WEST')),
    -- 수정: 모든 컬럼에 MAXVALUE 지정
    PARTITION p_max VALUES LESS THAN (MAXVALUE, MAXVALUE)
        (SUBPARTITION p_max_east VALUES ('EAST'),
         SUBPARTITION p_max_west VALUES ('WEST'))
);

원인 3 해결: SPLIT PARTITION 및 ADD PARTITION 시 올바른 MAXVALUE 사용

잘못된 SPLIT 예시 (에러 발생):

-- 기존 MAXVALUE 파티션을 분할할 때의 잘못된 예
ALTER TABLE sales_data
SPLIT PARTITION p_max
    AT (MAXVALUE, 6)              -- 에러: 첫 컬럼만 MAXVALUE
    INTO (
        PARTITION p_2024_h1,
        PARTITION p_new_max
    );
-- ORA-14021 발생

올바른 SPLIT 예시 (에러 해결):

-- 복합 키의 모든 컬럼에 올바른 값 지정
ALTER TABLE sales_data
SPLIT PARTITION p_max
    AT (2024, 6)                  -- 두 컬럼 모두 실제 경계값 지정
    INTO (
        PARTITION p_2024_h1,
        PARTITION p_new_max
    );

-- 또는 새 파티션 추가 시 올바른 방법
ALTER TABLE sales_data
ADD PARTITION p_2025
    VALUES LESS THAN (2025, MAXVALUE);  -- 단일 컬럼이 MAXVALUE인 경우 올바른 예

-- 복합 키에서 모든 MAXVALUE 올바르게 지정
ALTER TABLE sales_data
ADD PARTITION p_future
    VALUES LESS THAN (MAXVALUE, MAXVALUE);

현재 파티션 경계값 확인 쿼리

-- 기존 파티션 테이블의 경계값 확인
SELECT
    table_name,
    partition_name,
    partition_position,
    high_value,
    num_rows
FROM
    user_tab_partitions
WHERE
    table_name = 'SALES_DATA'
ORDER BY
    partition_position;

-- 복합 파티션 키 컬럼 확인
SELECT
    table_name,
    partitioning_type,
    partition_count,
    partitioning_key_count
FROM
    user_part_tables
WHERE
    table_name = 'SALES_DATA';

-- 파티션 키 컬럼 상세 정보
SELECT
    name,
    object_type,
    column_name,
    column_position
FROM
    user_part_key_columns
WHERE
    name = 'SALES_DATA'
ORDER BY
    column_position;

예방 방법

1. 파티션 DDL 작성 시 복합 키 컬럼 수 체크리스트 활용

파티션 테이블을 생성하거나 수정하기 전에 반드시 파티션 키로 사용되는 컬럼의 개수를 user_part_key_columns 뷰에서 확인하고, MAXVALUE를 사용하는 파티션 경계값에서 해당 컬럼 수와 동일하게 MAXVALUE를 지정했는지 검토하는 체크리스트를 도입하세요. DDL 스크립트 배포 전 개발/스테이징 환경에서 반드시 사전 테스트를 수행하고, 파티션 관리 작업은 코드 리뷰 프로세스를 거치도록 팀 내 정책으로 확립하는 것을 권장합니다.

2. MAXVALUE 파티션을 항상 마지막 DEFAULT 파티션으로 유지

복합 RANGE 파티션 테이블 설계 시, (MAXVALUE, MAXVALUE) 형태의 DEFAULT 파티션을 테이블 생성 초기부터 마지막 파티션으로 반드시 포함시키는 설계 원칙을 수립하세요. 새로운 기간 파티션이 필요할 때마다 DEFAULT 파티션을 SPLIT하는 방식(SPLIT PARTITION p_max AT (특정값, 특정값))을 사용하면, 항상 모든 컬럼에 실제 경계값을 지정하게 되어 ORA-14021 에러를 원천적으로 예방할 수 있습니다.


관련 에러

  • ORA-14019: 파티션 경계값이 허용되지 않는 문자를 포함하거나 올바르지 않은 형식일 때 발생합니다.
  • ORA-14020: MAXVALUE 파티션 뒤에 추가 파티션을 정의하려 할 때 발생하는 에러로, ORA-14021과 함께 RANGE 파티션 설계 오류 시 자주 동반됩니다.
  • ORA-14036: 파티션 경계값이 다음 파티션의 경계값보다 크거나 같을 때 발생하며, 파티션 순서 오류와 관련됩니다.
  • ORA-14400: 삽입하려는 행이 어떤 파티션에도 해당하지 않을 때 발생하며, DEFAULT MAXVALUE 파티션 누락 시 INSERT 오류로 이어질 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기