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

ORA-30026
2026년 10월 08일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-30026 UNDO segment is too old, needs more history 는?

ORA-30026 에러는 Oracle 데이터베이스에서 UNDO 세그먼트가 너무 오래되어 필요한 히스토리 정보를 더 이상 제공할 수 없을 때 발생합니다. 주로 장시간 실행되는 쿼리나 트랜잭션이 UNDO 데이터를 참조하려 할 때, 해당 UNDO 정보가 이미 덮어씌워진 경우에 나타납니다. 이 에러는 Oracle 9i 이전의 수동 UNDO 관리(Rollback Segment) 환경 또는 AUM(Automatic UNDO Management) 환경 모두에서 발생할 수 있으며, 특히 대용량 배치 처리나 리포팅 쿼리 환경에서 빈번하게 목격됩니다.


주요 발생 원인

  • UNDO_RETENTION 파라미터 값이 너무 낮게 설정된 경우

Oracle AUM 환경에서 UNDO_RETENTION 파라미터는 UNDO 데이터를 얼마나 오래 보존할지를 초 단위로 지정합니다. 기본값은 900초(15분)인데, 장시간 실행되는 쿼리나 배치 작업이 이 시간을 초과하면 이미 만료된 UNDO 데이터를 참조하려다 ORA-30026이 발생합니다. 특히 야간 배치나 대규모 리포트 쿼리가 수 시간에 걸쳐 실행될 경우, 이 값이 실행 시간보다 훨씬 짧게 설정되어 있으면 문제가 반드시 발생합니다.

  • UNDO 테이블스페이스 크기가 충분하지 않은 경우

UNDO 테이블스페이스의 물리적 공간이 부족하면, Oracle은 아직 만료되지 않은 UNDO 데이터도 강제로 덮어씌워 새로운 트랜잭션을 위한 공간을 확보하려 합니다. 이 과정에서 기존 쿼리가 참조해야 할 UNDO 블록이 사라지면서 ORA-30026 에러가 발생합니다. UNDO 테이블스페이스가 자동 확장(AUTOEXTEND)이 꺼져 있거나, 최대 크기(MAXSIZE) 제한에 도달한 경우에도 동일한 현상이 발생합니다.

  • 수동 UNDO 관리(Rollback Segment) 환경에서 롤백 세그먼트 크기 및 수가 부족한 경우

Oracle 9i 이전 혹은 수동 UNDO 모드(UNDO_MANAGEMENT=MANUAL)를 사용하는 환경에서는, 롤백 세그먼트의 수나 개별 세그먼트의 OPTIMAL/MAXEXTENTS 설정이 너무 작으면 UNDO 히스토리가 빠르게 소진됩니다. 대용량 DML(INSERT, UPDATE, DELETE) 처리 시 롤백 세그먼트가 조기에 wrap-around 되면서, 이미 읽기를 시작한 다른 쿼리가 필요한 이전 버전 데이터를 찾지 못하게 됩니다.


해결 방법

1. UNDO_RETENTION 값 증가

현재 UNDO_RETENTION 설정 값을 확인하고, 장시간 실행 쿼리의 최대 수행 시간을 고려하여 값을 늘립니다.

-- 현재 UNDO_RETENTION 설정 확인
SHOW PARAMETER UNDO_RETENTION;

-- 또는 V$PARAMETER 뷰에서 확인
SELECT name, value, description
FROM v$parameter
WHERE name = 'undo_retention';

-- UNDO_RETENTION을 3600초(1시간)로 변경 (동적 변경 가능)
ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH;

-- 장시간 배치 환경이라면 더 크게 설정 (예: 6시간)
ALTER SYSTEM SET UNDO_RETENTION = 21600 SCOPE=BOTH;

> 주의: UNDO_RETENTION을 늘리면 UNDO 테이블스페이스의 공간 사용량도 함께 늘어납니다. 반드시 UNDO 테이블스페이스 여유 공간을 먼저 확인하세요.


2. UNDO 테이블스페이스 크기 확인 및 확장

-- 현재 UNDO 테이블스페이스 사용 현황 확인
SELECT tablespace_name,
       ROUND(SUM(bytes) / 1024 / 1024, 2) AS total_mb,
       ROUND(SUM(CASE WHEN status = 'EXPIRED' THEN bytes ELSE 0 END) / 1024 / 1024, 2) AS expired_mb,
       ROUND(SUM(CASE WHEN status = 'UNEXPIRED' THEN bytes ELSE 0 END) / 1024 / 1024, 2) AS unexpired_mb,
       ROUND(SUM(CASE WHEN status = 'ACTIVE' THEN bytes ELSE 0 END) / 1024 / 1024, 2) AS active_mb
FROM dba_undo_extents
GROUP BY tablespace_name;

-- UNDO 테이블스페이스의 데이터파일 확인
SELECT file_name, bytes / 1024 / 1024 AS size_mb,
       autoextensible, maxbytes / 1024 / 1024 AS max_mb
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS1';

-- UNDO 테이블스페이스 데이터파일 크기 확장
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/undotbs01.dbf'
RESIZE 4096M;

-- AUTOEXTEND 활성화 (필요한 경우)
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/undotbs01.dbf'
AUTOEXTEND ON NEXT 512M MAXSIZE 8192M;

-- 새 데이터파일 추가로 UNDO 테이블스페이스 확장
ALTER TABLESPACE UNDOTBS1
ADD DATAFILE '/u01/oradata/ORCL/undotbs02.dbf'
SIZE 2048M AUTOEXTEND ON NEXT 512M MAXSIZE 8192M;

3. UNDO 보존 보장(Retention Guarantee) 활성화

UNDO 데이터가 강제로 덮어씌워지지 않도록 보장 옵션을 활성화합니다.

-- RETENTION GUARANTEE 설정 (UNDO 데이터를 절대 조기 삭제하지 않음)
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;

-- 현재 RETENTION 설정 확인
SELECT tablespace_name, retention
FROM dba_tablespaces
WHERE contents = 'UNDO';

> 주의: RETENTION GUARANTEE를 설정하면 UNDO 공간이 부족할 경우 트랜잭션이 실패할 수 있습니다. UNDO 테이블스페이스가 충분히 크게 설정되어 있을 때만 사용하세요.


4. 수동 UNDO 모드에서 롤백 세그먼트 추가 및 크기 조정

-- 현재 롤백 세그먼트 상태 확인
SELECT segment_name, status, initial_extent, next_extent,
       min_extents, max_extents, pct_increase, optsize
FROM dba_rollback_segs;

-- 대용량 작업을 위한 롤백 세그먼트 생성
CREATE ROLLBACK SEGMENT rbs_large
TABLESPACE rbs_tbs
STORAGE (
    INITIAL  256M
    NEXT     256M
    MINEXTENTS 2
    MAXEXTENTS UNLIMITED
    OPTIMAL  512M
);

-- 생성한 롤백 세그먼트 온라인 전환
ALTER ROLLBACK SEGMENT rbs_large ONLINE;

-- 특정 세션에서 대용량 트랜잭션 시 명시적으로 롤백 세그먼트 지정
SET TRANSACTION USE ROLLBACK SEGMENT rbs_large;

5. 현재 UNDO 관련 통계 모니터링

-- UNDO 관련 핵심 지표 확인 (튜닝 기준 자료로 활용)
SELECT name, value
FROM v$sysstat
WHERE name IN (
    'undo blocks written',
    'undo records applied',
    'transaction rollbacks'
);

-- UNDO 세그먼트별 통계 확인
SELECT usn, xacts, writes, shrinks, wraps, extends
FROM v$rollstat
ORDER BY wraps DESC;

-- 장시간 실행 중인 쿼리와 UNDO 사용량 조인 조회
SELECT s.sid, s.serial#, s.username, s.status,
       s.sql_id, t.used_ublk * 8 / 1024 AS undo_used_mb,
       s.last_call_et AS elapsed_sec
FROM v$session s
JOIN v$transaction t ON s.taddr = t.addr
ORDER BY t.used_ublk DESC;

예방 방법

  • UNDO 테이블스페이스 크기를 사전에 적절히 산정하고 모니터링을 자동화하라

실무에서 UNDO 테이블스페이스의 권장 크기는 UNDO_RETENTION × 초당 UNDO 생성 블록 수 × 블록 크기로 계산할 수 있습니다. Oracle이 제공하는 V$UNDOSTAT 뷰를 주기적으로 모니터링하여 UNDO 사용 트렌드를 파악하고, 사용률이 80%를 초과하기 전에 자동 알림이 발송되도록 OEM(Oracle Enterprise Manager) 임계값 경보를 설정하세요.

“`sql

— UNDO 크기 산정을 위한 기준 데이터 조회 (최근 4일치 통계)

SELECT TO_CHAR(begin_time, ‘YYYY-MM-DD HH24:MI’) AS begin_time,

undoblks,

txncount,

maxquerylen,

ssolderrcnt, — ORA-01555 발생 횟수

nospaceerrcnt — 공간 부족 에러 횟수

FROM v$undostat

ORDER BY begin_time DESC

FETCH FIRST 100 ROWS ONLY;

“`

  • 장시간 실행 쿼리는 반드시 UNDO 친화적인 설계로 분할 처리하라

단일 대용량 트랜잭션 대신, 배치 처리 시 COMMIT 주기를 적절히 나누어 UNDO 축적을 최소화하세요. 특히 수백만 건 이상의 DML은 10만~50만 건 단위로 나누어 처리하고, 읽기 전용 리포트 쿼리는 AS OF SCN 또는 AS OF TIMESTAMP 플래시백 쿼리를 활용하여 특정 시점의 스냅샷을 조회하는 방식으로 설계하면 ORA-30026과 ORA-01555를 동시에 예방할 수 있습니다.

“`sql

— 배치 처리 시 분할 COMMIT 예시 (PL/SQL)

DECLARE

v_commit_cnt NUMBER := 0;

BEGIN

FOR rec IN (SELECT rowid AS rid FROM large_table WHERE status = ‘PENDING’) LOOP

UPDATE large_table SET status = ‘DONE’, updated_at = SYSDATE

WHERE rowid = rec.rid;

v_commit_cnt := v_commit_cnt + 1;

IF MOD(v_commit_cnt, 100000) = 0 THEN

COMMIT;

END IF;

END LOOP;

COMMIT; — 마지막 나머지 처리

END;

/

“`


관련 에러

  • ORA-01555 (Snapshot too old): ORA-30026과 가장 밀접한 관련 에러로, UNDO 데이터가 너무 오래되어 읽기 일관성(Read Consistency)을 보장할 수 없을 때 발생합니다. 두 에러 모두 UNDO_RETENTION 증가와 UNDO 테이블스페이스 확장으로 해결합니다.
  • ORA-30036 (unable to extend segment in undo tablespace): UNDO 테이블스페이스의 공간이 완전히 소진되었을 때 발생하며, ORA-30026의 전조 증상이 될 수 있습니다.
  • ORA-01628 (max # extents reached for rollback segment): 수동 UNDO 모드에서 롤백 세그먼트의 최대 익스텐트 수에 도달했을 때 발생하며, MAXEXTENTS 설정과 관련됩니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기