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

ORA-02245
2026년 08월 13일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-02245 invalid ROLLBACK SEGMENT name 는?

ORA-02245 에러는 Oracle 데이터베이스에서 SET TRANSACTION USE ROLLBACK SEGMENT 또는 ROLLBACK TO SAVEPOINT 구문 등에서 존재하지 않거나 잘못된 롤백 세그먼트 이름을 지정했을 때 발생하는 에러입니다. 주로 수동 롤백 세그먼트(Manual Undo Management) 환경에서 트랜잭션에 특정 롤백 세그먼트를 명시적으로 할당하려 할 때 나타나며, 자동 언두 관리(AUM, Automatic Undo Management) 환경에서도 잘못된 구문 사용 시 발생할 수 있습니다. 이 에러는 롤백 세그먼트 이름의 오타, 미존재, 또는 OFFLINE 상태 등 다양한 원인으로 인해 트랜잭션이 시작조차 되지 않는 심각한 운영 장애로 이어질 수 있으므로 반드시 정확한 원인 파악과 조치가 필요합니다.


주요 발생 원인

1. 존재하지 않는 롤백 세그먼트 이름 지정

가장 흔한 원인으로, 실제 데이터베이스에 존재하지 않는 롤백 세그먼트 이름을 명시적으로 지정한 경우입니다. 오타가 있거나 과거에 삭제된 롤백 세그먼트 이름을 그대로 사용하는 배치 스크립트, 레거시 코드에서 자주 발생합니다. 예를 들어 RBS01이라는 롤백 세그먼트가 없는데 해당 이름을 지정하면 즉시 ORA-02245가 발생합니다.

2. 롤백 세그먼트가 OFFLINE 상태

롤백 세그먼트가 데이터베이스에 존재하더라도 OFFLINE 상태이면 트랜잭션에 할당할 수 없어 에러가 발생합니다. DBA가 의도적으로 또는 테이블스페이스 이슈로 인해 롤백 세그먼트를 OFFLINE으로 변경한 경우, 해당 롤백 세그먼트를 명시적으로 사용하려는 모든 트랜잭션에서 ORA-02245가 발생할 수 있습니다. 특히 야간 배치 작업에서 대용량 롤백 세그먼트를 지정해두었다가 DBA가 이를 OFFLINE 처리한 경우 다음 날 배치 장애로 이어지는 사례가 많습니다.

3. 자동 언두 관리(AUM) 환경에서의 수동 롤백 세그먼트 지정 시도

Oracle 9i 이후 기본적으로 AUM(Automatic Undo Management)이 사용되며, 이 환경에서는 SET TRANSACTION USE ROLLBACK SEGMENT 구문 자체가 무의미하거나 제한됩니다. AUM 환경에서 과거 수동 언두 관리 방식의 코드를 그대로 사용하거나, UNDO_MANAGEMENT=AUTO로 설정된 상태에서 존재하지 않는 롤백 세그먼트를 지정하면 ORA-02245가 발생할 수 있습니다. 이 경우 언두 관리 방식 자체를 재검토해야 합니다.


해결 방법

원인 1: 현재 데이터베이스의 롤백 세그먼트 목록 확인

먼저 실제로 존재하는 롤백 세그먼트를 확인하고, 올바른 이름을 사용해야 합니다.

-- 현재 데이터베이스의 모든 롤백 세그먼트 조회
SELECT segment_name, owner, tablespace_name, status
FROM dba_rollback_segs
ORDER BY segment_name;

-- ONLINE 상태인 롤백 세그먼트만 조회
SELECT segment_name, status
FROM dba_rollback_segs
WHERE status = 'ONLINE';

위 쿼리로 확인한 정확한 이름을 사용하여 트랜잭션을 시작합니다.

-- 올바른 롤백 세그먼트 이름으로 트랜잭션 지정
SET TRANSACTION USE ROLLBACK SEGMENT RBS_LARGE;

-- 이후 DML 작업 수행
UPDATE orders SET status = 'PROCESSED' WHERE order_date < SYSDATE - 365;
COMMIT;

원인 2: OFFLINE 롤백 세그먼트를 ONLINE으로 변경

롤백 세그먼트가 OFFLINE 상태인 경우 DBA 권한으로 ONLINE으로 변경해야 합니다.

-- 롤백 세그먼트 상태 확인
SELECT segment_name, status, tablespace_name
FROM dba_rollback_segs
WHERE status != 'ONLINE';

-- 롤백 세그먼트를 ONLINE으로 변경
ALTER ROLLBACK SEGMENT RBS_LARGE ONLINE;

-- 변경 후 상태 재확인
SELECT segment_name, status
FROM dba_rollback_segs
WHERE segment_name = 'RBS_LARGE';

ONLINE으로 변경한 이후 트랜잭션을 다시 실행합니다.

-- ONLINE 전환 후 트랜잭션 재시도
SET TRANSACTION USE ROLLBACK SEGMENT RBS_LARGE;
INSERT INTO archive_table SELECT * FROM source_table WHERE created_date < ADD_MONTHS(SYSDATE, -12);
COMMIT;

원인 3: AUM 환경에서의 언두 설정 확인 및 코드 수정

AUM 환경임을 확인하고, 수동 롤백 세그먼트 지정 코드를 제거하거나 AUM에 맞는 방식으로 수정합니다.

-- 현재 언두 관리 방식 확인
SHOW PARAMETER undo_management;

-- 언두 테이블스페이스 및 설정 확인
SHOW PARAMETER undo_tablespace;
SHOW PARAMETER undo_retention;

-- AUM 환경에서의 언두 세그먼트 정보 확인
SELECT usn, xacts, rssize/1024/1024 AS size_mb, status
FROM v$rollstat rs, v$rollname rn
WHERE rs.usn = rn.usn;

AUM 환경에서는 SET TRANSACTION USE ROLLBACK SEGMENT 구문 대신 아래와 같이 언두 보존 시간을 조정하는 방식을 사용합니다.

-- AUM 환경에서 언두 보존 시간 조정 (단위: 초)
ALTER SYSTEM SET undo_retention = 3600;

-- 특정 세션에서 대용량 트랜잭션 처리 시 권장 방식
-- (롤백 세그먼트 명시 없이 AUM이 자동으로 관리)
BEGIN
  FOR i IN 1..1000000 LOOP
    UPDATE large_table SET processed = 'Y' WHERE id = i;
    IF MOD(i, 10000) = 0 THEN
      COMMIT; -- 주기적 커밋으로 언두 세그먼트 부담 감소
    END IF;
  END LOOP;
  COMMIT;
END;
/

예방 방법

1. 롤백 세그먼트 이름을 하드코딩하지 않고 동적으로 검증하는 프로시저 사용

배치 스크립트나 애플리케이션에서 롤백 세그먼트 이름을 하드코딩하는 대신, 실행 전에 해당 롤백 세그먼트가 ONLINE 상태인지 동적으로 검증하는 로직을 추가하는 것이 좋습니다. 아래와 같이 실행 전 유효성 검증 프로시저를 만들어 활용하면 ORA-02245 에러를 사전에 방지할 수 있습니다.

-- 롤백 세그먼트 유효성 검증 프로시저
CREATE OR REPLACE PROCEDURE validate_rollback_segment(p_seg_name IN VARCHAR2) AS
  v_count NUMBER;
  v_status VARCHAR2(20);
BEGIN
  SELECT COUNT(*), MAX(status)
  INTO v_count, v_status
  FROM dba_rollback_segs
  WHERE segment_name = UPPER(p_seg_name);

  IF v_count = 0 THEN
    RAISE_APPLICATION_ERROR(-20001, '롤백 세그먼트가 존재하지 않습니다: ' || p_seg_name);
  ELSIF v_status != 'ONLINE' THEN
    RAISE_APPLICATION_ERROR(-20002, '롤백 세그먼트가 ONLINE 상태가 아닙니다: ' || p_seg_name || ' (현재 상태: ' || v_status || ')');
  ELSE
    DBMS_OUTPUT.PUT_LINE('롤백 세그먼트 ' || p_seg_name || ' 사용 가능 (상태: ONLINE)');
  END IF;
END;
/

-- 사용 예시
EXEC validate_rollback_segment('RBS_LARGE');

2. AUM 환경으로 마이그레이션 및 레거시 수동 언두 코드 제거

Oracle 9i 이상의 환경에서는 AUM을 사용하는 것이 Oracle의 공식 권장 사항입니다. 레거시 시스템에서 수동 언두 관리 방식의 코드가 남아 있다면 이를 전수 조사하여 제거하거나 수정해야 합니다. 정기적인 코드 리뷰와 데이터베이스 파라미터 점검을 통해 UNDO_MANAGEMENT 설정과 코드의 일관성을 유지하는 것이 장기적인 예방책입니다.

-- AUM 전환을 위한 파라미터 확인 및 설정 가이드
-- 1. 현재 설정 확인
SELECT name, value FROM v$parameter
WHERE name IN ('undo_management', 'undo_tablespace', 'undo_retention');

-- 2. 언두 테이블스페이스 생성 (AUM 전환 시)
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/u01/oradata/orcl/undotbs02.dbf' SIZE 2G AUTOEXTEND ON;

-- 3. AUM 전환 (pfile/spfile 수정 후 재시작 필요)
ALTER SYSTEM SET undo_management = AUTO SCOPE=SPFILE;
ALTER SYSTEM SET undo_tablespace = UNDOTBS2 SCOPE=SPFILE;

관련 에러

  • ORA-01552: 시스템 이외의 테이블스페이스에 시스템 롤백 세그먼트를 사용할 수 없을 때 발생하며, 롤백 세그먼트 설정과 밀접하게 연관됩니다.
  • ORA-01534: 롤백 세그먼트가 존재하지 않을 때 발생하는 에러로 ORA-02245와 유사한 상황에서 나타날 수 있습니다.
  • ORA-30036: AUM 환경에서 언두 테이블스페이스 공간이 부족할 때 발생하며, 롤백 세그먼트 관련 공간 관리 문제와 연관됩니다.
  • ORA-01628: 롤백 세그먼트의 최대 익스텐트 수를 초과했을 때 발생하는 에러로, 대용량 트랜잭션에서 ORA-02245와 함께 나타날 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기