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

ORA-12021
2026년 09월 05일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-12021 materialized view definition is out of date; refresh materialized view 는?

ORA-12021 에러는 Materialized View(구체화 뷰)의 정의가 기반 테이블 또는 뷰의 구조 변경으로 인해 더 이상 유효하지 않게 되었을 때 발생하는 에러입니다. 쉽게 말해, Materialized View가 참조하는 원본 객체(테이블, 뷰 등)의 DDL이 변경되었지만, Materialized View 자체는 아직 그 변경 사항을 반영하지 못한 상태를 의미합니다. 주로 운영 환경에서 스키마 변경 작업 후 Materialized View를 조회하거나 해당 View를 기반으로 쿼리를 실행할 때 이 에러가 표면에 드러납니다.


주요 발생 원인

1. 기반 테이블의 DDL 변경 (컬럼 추가/삭제/수정)

가장 흔한 원인으로, Materialized View가 참조하는 원본 테이블에 ALTER TABLE 명령으로 컬럼이 추가되거나, 삭제되거나, 데이터 타입이 변경될 때 발생합니다. Oracle은 이 상황을 감지하면 해당 Materialized View를 NEEDS COMPILE 또는 UNUSABLE 상태로 마킹하며, 이후 해당 View에 접근하면 ORA-12021 에러를 반환합니다. 특히 대규모 스키마 마이그레이션이나 배포 작업 중에 자주 마주치는 상황입니다.

2. 기반 뷰(View) 또는 중간 객체의 재컴파일

Materialized View가 단순 테이블이 아닌 일반 뷰(View)나 다른 Materialized View를 기반으로 정의된 경우, 그 중간 객체가 재컴파일되거나 무효화(INVALID)되면 연쇄적으로 상위 Materialized View까지 영향을 받아 ORA-12021이 발생할 수 있습니다. 객체 의존성 체인이 복잡할수록 문제 추적이 어려워지므로, DBA_DEPENDENCIES 뷰를 통해 의존 관계를 파악하는 것이 중요합니다.

3. 불완전한 Materialized View Refresh 또는 강제 중단

예약된 Materialized View Refresh 작업이 중간에 오류로 인해 실패하거나, DBA가 Refresh 세션을 강제로 종료한 경우, Materialized View의 메타데이터와 실제 데이터 간에 불일치가 발생하여 정의가 outdated 상태로 남을 수 있습니다. 이 경우 DBA_MVIEWS 딕셔너리에서 COMPILE_STATE 컬럼이 NEEDS COMPILE로 표시되며, Refresh를 다시 수동으로 실행해야 합니다.


해결 방법

해결책 1: Materialized View 수동 Refresh 실행

가장 우선적으로 시도해야 할 방법입니다. DBMS_MVIEW.REFRESH 프로시저를 사용하여 Materialized View를 강제로 갱신합니다.

-- 단일 Materialized View Refresh (COMPLETE 방식)
BEGIN
    DBMS_MVIEW.REFRESH(
        list => 'SCHEMA_NAME.MV_SALES_SUMMARY',
        method => 'C',   -- C: Complete, F: Fast, ?: Force
        atomic_refresh => FALSE
    );
END;
/

-- 여러 Materialized View 동시 Refresh
BEGIN
    DBMS_MVIEW.REFRESH(
        list => 'MV_SALES_SUMMARY,MV_CUSTOMER_STAT,MV_PRODUCT_REPORT',
        method => 'C',
        atomic_refresh => FALSE
    );
END;
/

-- Refresh 후 상태 확인
SELECT mview_name,
       last_refresh_date,
       compile_state,
       staleness
FROM   dba_mviews
WHERE  owner = 'SCHEMA_NAME';

해결책 2: Materialized View 재컴파일

Refresh만으로 해결되지 않는 경우, ALTER MATERIALIZED VIEW ... COMPILE 명령으로 재컴파일을 시도합니다.

-- Materialized View 재컴파일
ALTER MATERIALIZED VIEW schema_name.mv_sales_summary COMPILE;

-- 재컴파일 후 상태 확인
SELECT object_name,
       object_type,
       status,
       last_ddl_time
FROM   dba_objects
WHERE  object_type = 'MATERIALIZED VIEW'
  AND  owner = 'SCHEMA_NAME'
ORDER BY last_ddl_time DESC;

해결책 3: 문제 Materialized View 재생성

DDL 변경이 크거나 재컴파일/Refresh로 해결이 안 될 경우, Materialized View를 Drop 후 재생성합니다.

-- 현재 Materialized View 정의 확인 (재생성 전 백업용)
SELECT dbms_metadata.get_ddl('MATERIALIZED_VIEW', 'MV_SALES_SUMMARY', 'SCHEMA_NAME')
FROM   dual;

-- Materialized View 삭제 및 재생성
DROP MATERIALIZED VIEW schema_name.mv_sales_summary;

CREATE MATERIALIZED VIEW schema_name.mv_sales_summary
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
ENABLE QUERY REWRITE
AS
SELECT  dept_id,
        product_id,
        SUM(sales_amount) AS total_sales,
        COUNT(*)          AS order_count
FROM    schema_name.sales_fact
GROUP BY dept_id, product_id;

해결책 4: 무효화된 Materialized View 일괄 처리

여러 Materialized View가 동시에 문제가 생긴 경우 아래 스크립트로 일괄 처리합니다.

-- 현재 문제 있는 Materialized View 목록 확인
SELECT owner,
       mview_name,
       compile_state,
       staleness,
       last_refresh_date
FROM   dba_mviews
WHERE  compile_state != 'VALID'
ORDER BY owner, mview_name;

-- 무효 상태인 Materialized View 일괄 재컴파일 스크립트 생성
SELECT 'ALTER MATERIALIZED VIEW ' || owner || '.' || mview_name || ' COMPILE;'
FROM   dba_mviews
WHERE  compile_state != 'VALID';

-- UTL_RECOMP 패키지를 이용한 스키마 전체 무효 객체 재컴파일
EXEC UTL_RECOMP.RECOMP_SERIAL('SCHEMA_NAME');

예방 방법

1. DDL 변경 전 Materialized View 의존성 사전 점검 및 변경 후 즉시 Refresh 자동화

운영 환경에서 테이블 스키마를 변경하기 전에 반드시 DBA_DEPENDENCIES를 조회하여 해당 테이블을 참조하는 Materialized View 목록을 확인해야 합니다. DDL 변경 스크립트에 변경 후 Refresh 및 COMPILE 구문을 포함시키는 것을 표준 배포 절차로 정착시키면 대부분의 ORA-12021 에러를 사전에 방지할 수 있습니다.

-- DDL 변경 전 의존성 확인
SELECT referenced_owner,
       referenced_name,
       referenced_type,
       owner,
       name,
       type
FROM   dba_dependencies
WHERE  referenced_name  = 'SALES_FACT'
  AND  referenced_owner = 'SCHEMA_NAME'
  AND  type             = 'MATERIALIZED VIEW';

2. 정기적인 Materialized View 상태 모니터링 및 자동 Refresh 스케줄 설정

DBMS_SCHEDULER 또는 DBMS_JOB을 활용하여 Materialized View의 Refresh를 정기적으로 자동화하고, 상태 이상 시 알림이 오도록 모니터링 체계를 구축해야 합니다. 아래와 같이 Scheduler Job을 등록하여 매일 새벽 자동 Refresh가 실행되도록 설정하는 것을 권장합니다.

-- DBMS_SCHEDULER를 이용한 자동 Refresh Job 등록
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        job_name        => 'JOB_REFRESH_MV_SALES',
        job_type        => 'PLSQL_BLOCK',
        job_action      => 'BEGIN DBMS_MVIEW.REFRESH(''SCHEMA_NAME.MV_SALES_SUMMARY'', ''C''); END;',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0',
        enabled         => TRUE,
        comments        => 'Daily refresh for MV_SALES_SUMMARY'
    );
END;
/

관련 에러

  • ORA-12008: Materialized View Refresh 경로에 에러가 발생했을 때 나타나는 에러로, ORA-12021과 함께 발생하는 경우가 많습니다.
  • ORA-32321: Materialized View Log가 너무 오래되어 Fast Refresh가 불가능할 때 발생하며, Complete Refresh로 전환하면 해결됩니다.
  • ORA-01031: Refresh를 수행하는 사용자에게 기반 테이블에 대한 충분한 권한이 없을 때 발생하며, ORA-12021 이후 Refresh 시도 중 나타날 수 있습니다.
  • ORA-12004: Fast Refresh를 지원하지 않는 Materialized View에 Fast Refresh를 시도할 때 발생합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기