2026년 09월 22일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-14075 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-14075 partition maintenance operations may only be performed on partitioned objects 는?
ORA-14075 에러는 파티션 유지보수 작업(예: ALTER TABLE … DROP PARTITION, TRUNCATE PARTITION, SPLIT PARTITION 등)을 파티션이 적용되지 않은 일반 테이블 또는 인덱스에 수행하려 할 때 발생합니다. Oracle은 파티션 관련 DDL 명령어를 오직 파티션드 오브젝트(Partitioned Table, Partitioned Index)에만 허용하기 때문에, 일반 힙(Heap) 테이블에 동일한 명령을 실행하면 이 에러가 즉시 발생합니다. 실수로 테이블명을 잘못 입력하거나, 오브젝트의 파티션 여부를 확인하지 않고 스크립트를 실행하는 경우가 대표적인 상황입니다.
주요 발생 원인
1. 비파티션 테이블에 파티션 DDL 명령 실행
가장 흔한 원인으로, 개발자나 DBA가 테이블이 파티션드 테이블이라고 착각하고 ALTER TABLE ... DROP PARTITION 또는 TRUNCATE PARTITION 명령을 실행하는 경우입니다. 특히 여러 환경(개발, 테스트, 운영)에서 동일한 스크립트를 실행할 때, 특정 환경에만 파티션이 적용되어 있고 다른 환경에는 일반 테이블로 생성된 경우 이 에러가 발생합니다.
2. 잘못된 테이블명 또는 오브젝트명 참조
스크립트 내에서 테이블명을 오타로 잘못 입력하거나, 파티션드 테이블과 유사한 이름의 일반 테이블을 대상으로 파티션 작업을 시도하는 경우입니다. 예를 들어 SALES_PART 라는 파티션드 테이블 대신 SALES 라는 일반 테이블을 대상으로 파티션 명령을 실행하면 에러가 발생합니다. 대규모 스키마에서 오브젝트 수가 많을수록 이러한 실수가 빈번하게 일어납니다.
3. 자동화 스크립트 또는 배치 작업의 오브젝트 타입 미검증
배치 스크립트나 자동화된 파티션 관리 프로시저에서 실행 대상 테이블의 파티션 여부를 사전에 검증하지 않고 일괄적으로 파티션 DDL을 수행하는 경우입니다. 운영 환경에서 테이블 구조가 변경되었거나 재생성 과정에서 파티션 옵션이 누락된 경우 배치 작업 전체가 실패할 수 있습니다. 이는 야간 배치나 월말 정산 작업 중 발생하면 장애로 이어지는 위험한 케이스입니다.
해결 방법
Step 1. 대상 오브젝트의 파티션 여부 확인
파티션 DDL을 실행하기 전에 반드시 해당 테이블 또는 인덱스가 파티션드 오브젝트인지 확인합니다.
-- 테이블의 파티션 여부 확인
SELECT TABLE_NAME, PARTITIONED, NUM_ROWS
FROM USER_TABLES
WHERE TABLE_NAME = 'SALES';
-- 파티션 정보 상세 조회
SELECT TABLE_NAME, PARTITION_NAME, PARTITION_POSITION,
HIGH_VALUE, NUM_ROWS, LAST_ANALYZED
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'SALES'
ORDER BY PARTITION_POSITION;
-- 인덱스의 파티션 여부 확인
SELECT INDEX_NAME, PARTITIONED, TABLE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = 'SALES';
Step 2. 파티션드 테이블로 변환 (재생성)
만약 해당 테이블이 파티션 없이 생성되었다면, Oracle은 일반 테이블을 직접 파티션드 테이블로 변환하는 ALTER TABLE ... MODIFY 기능(12c 이상)을 제공합니다.
-- Oracle 12c 이상: 온라인으로 파티션 변환 (UPDATE INDEXES 포함)
ALTER TABLE SALES MODIFY
PARTITION BY RANGE (SALE_DATE)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION P_INITIAL VALUES LESS THAN (DATE '2024-01-01')
)
ONLINE
UPDATE INDEXES;
-- 변환 후 파티션 확인
SELECT PARTITION_NAME, HIGH_VALUE, NUM_ROWS
FROM USER_TAB_PARTITIONS
WHERE TABLE_NAME = 'SALES'
ORDER BY PARTITION_POSITION;
Step 3. 기존 데이터를 CTAS로 파티션드 테이블에 이관 (12c 미만 환경)
Oracle 11g 이하 환경이라면 CTAS(Create Table As Select) 방식으로 새 파티션드 테이블을 생성한 뒤 데이터를 이관합니다.
-- 1단계: 파티션드 테이블 신규 생성
CREATE TABLE SALES_PART
PARTITION BY RANGE (SALE_DATE)
(
PARTITION P2023 VALUES LESS THAN (DATE '2024-01-01'),
PARTITION P2024 VALUES LESS THAN (DATE '2025-01-01'),
PARTITION P_MAX VALUES LESS THAN (MAXVALUE)
)
AS
SELECT * FROM SALES;
-- 2단계: 기존 테이블 백업 후 이름 변경
RENAME SALES TO SALES_OLD;
RENAME SALES_PART TO SALES;
-- 3단계: 인덱스 재생성
CREATE INDEX IDX_SALES_DATE ON SALES(SALE_DATE) LOCAL;
-- 4단계: 파티션 작업 정상 수행 확인
ALTER TABLE SALES TRUNCATE PARTITION P2023;
Step 4. 자동화 스크립트에서 조건부 실행 처리
배치 스크립트 내에서 파티션 여부를 동적으로 확인한 후 DDL을 실행하도록 PL/SQL로 처리합니다.
DECLARE
v_partitioned VARCHAR2(3);
v_table_name VARCHAR2(30) := 'SALES';
BEGIN
-- 파티션 여부 조회
SELECT PARTITIONED
INTO v_partitioned
FROM USER_TABLES
WHERE TABLE_NAME = v_table_name;
IF v_partitioned = 'YES' THEN
-- 파티션드 테이블일 때만 파티션 DDL 실행
EXECUTE IMMEDIATE
'ALTER TABLE ' || v_table_name || ' DROP PARTITION P2022 UPDATE INDEXES';
DBMS_OUTPUT.PUT_LINE('파티션 삭제 완료: ' || v_table_name);
ELSE
DBMS_OUTPUT.PUT_LINE('경고: ' || v_table_name || ' 은 파티션드 테이블이 아닙니다.');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('에러: 테이블 ' || v_table_name || ' 을 찾을 수 없습니다.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('에러 발생: ' || SQLERRM);
RAISE;
END;
/
예방 방법
1. DDL 실행 전 파티션 검증 표준 절차 수립
모든 파티션 관련 DDL 스크립트 상단에 파티션 여부를 확인하는 검증 쿼리를 필수적으로 포함하는 내부 표준을 수립합니다. 특히 운영 환경에서는 DBA 리뷰 체크리스트에 USER_TABLES.PARTITIONED = 'YES' 확인 단계를 포함시켜야 합니다. 자동화 배치에서는 위의 PL/SQL 조건부 실행 패턴을 템플릿화하여 재사용하도록 팀 내 공유합니다.
2. 환경별 오브젝트 구조 차이 관리 강화
개발, 테스트, 운영 환경 간의 테이블 구조(파티션 포함 여부)를 동기화하는 프로세스를 정기적으로 수행합니다. DBMS_METADATA.GET_DDL을 활용하여 각 환경의 테이블 DDL을 비교하고, 파티션 여부가 다른 경우 즉시 알람이 발생하는 모니터링 스크립트를 구성합니다. 형상 관리 도구(Git 등)에 DDL 스크립트를 버전 관리하여 환경별 차이를 추적합니다.
-- 환경별 파티션드 테이블 목록 정기 점검
SELECT TABLE_NAME, PARTITIONED, NUM_ROWS, LAST_ANALYZED
FROM USER_TABLES
WHERE PARTITIONED = 'YES'
ORDER BY TABLE_NAME;
-- DDL 추출로 환경 간 비교
SELECT DBMS_METADATA.GET_DDL('TABLE', 'SALES') FROM DUAL;
관련 에러
- ORA-14074:
partition bound must collate higher than that of the last partition– 파티션 경계 값이 기존 파티션보다 높지 않을 때 발생합니다. - ORA-14076:
trailing null columns cannot be specified in the partition bound– 파티션 경계에 NULL 값을 잘못 사용할 때 발생합니다. - ORA-14006:
invalid partition name– 존재하지 않는 파티션 이름을 참조할 때 발생합니다. - ORA-02149:
Specified partition does not exist– 지정한 파티션이 없을 때 발생하는 에러로 ORA-14075와 혼동되기 쉽습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.