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

ORA-01545
2026년 07월 22일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01545 rollback segment specified not available 는?

ORA-01545 에러는 Oracle 데이터베이스에서 특정 롤백 세그먼트(Rollback Segment)를 명시적으로 지정하였으나, 해당 롤백 세그먼트를 사용할 수 없는 상태일 때 발생합니다. 주로 SET TRANSACTION USE ROLLBACK SEGMENT 구문을 사용하여 특정 롤백 세그먼트를 지정했을 때, 해당 세그먼트가 오프라인 상태이거나 존재하지 않을 경우에 나타납니다. 이 에러는 Oracle 9i 이전의 수동 언두 관리(Manual Undo Management) 환경에서 특히 자주 발생했으며, 자동 언두 관리(Automatic Undo Management, AUM) 환경에서도 잘못된 초기화 파라미터 설정으로 인해 발생할 수 있습니다.


주요 발생 원인

1. 롤백 세그먼트가 오프라인(OFFLINE) 상태인 경우

가장 빈번한 원인으로, 지정한 롤백 세그먼트가 현재 OFFLINE 상태에 있을 때 발생합니다. DBA가 의도적으로 특정 롤백 세그먼트를 오프라인으로 전환했거나, 데이터베이스 재시작 과정에서 자동으로 ONLINE 상태가 되지 않은 경우입니다. init.ora 또는 spfileROLLBACK_SEGMENTS 파라미터에 등록되지 않은 롤백 세그먼트는 데이터베이스 재시작 후 자동으로 ONLINE 상태로 전환되지 않으므로 주의가 필요합니다.

2. 존재하지 않는 롤백 세그먼트를 지정한 경우

애플리케이션 코드 또는 스크립트에서 하드코딩된 롤백 세그먼트 이름이 실제 데이터베이스에 존재하지 않을 때 발생합니다. 데이터베이스 마이그레이션, 환경 이전(개발 → 운영), 또는 롤백 세그먼트 재구성 작업 이후에 이름이 변경되거나 삭제된 경우가 대표적입니다. 특히 레거시 시스템에서 오래된 스크립트를 그대로 사용할 때 이 문제가 자주 발생합니다.

3. 자동 언두 관리(AUM) 환경에서 수동 롤백 세그먼트를 참조하는 경우

Oracle 9i 이후부터는 자동 언두 관리(AUM)가 권장되며, UNDO_MANAGEMENT=AUTO로 설정된 환경에서 SET TRANSACTION USE ROLLBACK SEGMENT 구문을 사용하면 에러가 발생할 수 있습니다. AUM 환경에서는 Oracle이 언두 세그먼트를 자동으로 관리하므로, 사용자가 직접 롤백 세그먼트를 지정하는 것이 지원되지 않거나 제한됩니다. 이 경우는 레거시 코드를 현대 환경에 적용할 때 가장 흔하게 마주치는 상황입니다.


해결 방법

원인 1: 롤백 세그먼트 상태 확인 및 ONLINE 전환

먼저 현재 롤백 세그먼트의 상태를 조회합니다.

-- 롤백 세그먼트 현재 상태 조회
SELECT segment_name, status, tablespace_name, initial_extent, next_extent
FROM dba_rollback_segs
ORDER BY segment_name;

OFFLINE 상태의 롤백 세그먼트를 ONLINE으로 전환합니다.

-- 특정 롤백 세그먼트를 ONLINE으로 전환
ALTER ROLLBACK SEGMENT rbs01 ONLINE;

-- 전환 후 상태 재확인
SELECT segment_name, status
FROM dba_rollback_segs
WHERE segment_name = 'RBS01';

데이터베이스 재시작 후에도 자동으로 ONLINE 상태가 유지되도록 init.ora 또는 spfile에 파라미터를 추가합니다.

-- SPFILE을 사용하는 경우 파라미터 설정
ALTER SYSTEM SET rollback_segments = 'RBS01', 'RBS02', 'RBS03' SCOPE=SPFILE;

-- 설정 확인
SHOW PARAMETER rollback_segments;

원인 2: 존재하는 롤백 세그먼트 확인 및 재생성

데이터베이스에 실제로 존재하는 롤백 세그먼트 목록을 조회하여 올바른 이름을 확인합니다.

-- 모든 롤백 세그먼트 목록 조회
SELECT segment_name, status, tablespace_name
FROM dba_rollback_segs
WHERE segment_name != 'SYSTEM';

-- 특정 언두 테이블스페이스 내 세그먼트 확인
SELECT segment_name, status
FROM dba_rollback_segs
WHERE tablespace_name = 'UNDOTBS1';

필요한 경우 롤백 세그먼트를 새로 생성합니다.

-- 롤백 세그먼트 생성 예시 (Manual Undo 환경)
CREATE ROLLBACK SEGMENT rbs01
TABLESPACE rbs_tbs
STORAGE (
    INITIAL   1M
    NEXT      1M
    MINEXTENTS 2
    MAXEXTENTS UNLIMITED
    OPTIMAL   5M
);

-- 생성 후 ONLINE으로 전환
ALTER ROLLBACK SEGMENT rbs01 ONLINE;

원인 3: AUM 환경에서 레거시 코드 수정

AUM 환경에서는 SET TRANSACTION USE ROLLBACK SEGMENT 구문 대신 표준 트랜잭션 관리 방식을 사용해야 합니다.

-- 잘못된 방식 (AUM 환경에서 에러 발생 가능)
-- SET TRANSACTION USE ROLLBACK SEGMENT rbs01;

-- 올바른 방식: AUM 환경에서는 언두 관련 파라미터로 관리
SHOW PARAMETER undo_management;
SHOW PARAMETER undo_tablespace;
SHOW PARAMETER undo_retention;

-- 언두 보존 시간 조정 (필요한 경우)
ALTER SYSTEM SET undo_retention = 900;

-- 현재 언두 테이블스페이스 상태 확인
SELECT tablespace_name, status, contents
FROM dba_tablespaces
WHERE contents = 'UNDO';

AUM 환경 여부를 확인하는 쿼리입니다.

-- 현재 언두 관리 방식 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('undo_management', 'undo_tablespace', 'rollback_segments');

예방 방법

1. 자동 언두 관리(AUM)로 전환 및 표준화

Oracle 9i 이상의 환경에서는 반드시 자동 언두 관리(AUM) 방식을 사용하도록 표준화해야 합니다. UNDO_MANAGEMENT=AUTO와 전용 언두 테이블스페이스를 구성하면, DBA가 수동으로 롤백 세그먼트를 관리할 필요가 없어지고 ORA-01545와 같은 에러를 근본적으로 예방할 수 있습니다. 또한 레거시 애플리케이션 코드에서 SET TRANSACTION USE ROLLBACK SEGMENT 구문이 사용되고 있는지 정기적으로 검토하고, 해당 구문을 제거하거나 주석 처리하는 작업을 선행해야 합니다.

-- AUM 전환을 위한 언두 테이블스페이스 생성 예시
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/oradata/undotbs2_01.dbf' SIZE 2G AUTOEXTEND ON;

-- 언두 테이블스페이스 전환
ALTER SYSTEM SET undo_tablespace = UNDOTBS2;

2. 모니터링 및 정기적인 상태 점검 자동화

롤백 세그먼트 또는 언두 세그먼트의 상태를 정기적으로 모니터링하는 스크립트를 스케줄링하여, 비정상 상태를 사전에 탐지할 수 있도록 해야 합니다. Oracle Enterprise Manager(OEM) 또는 커스텀 쉘 스크립트를 활용하여 OFFLINE 상태의 세그먼트가 감지될 경우 즉시 알림을 받을 수 있도록 구성하는 것이 Best Practice입니다.

-- 정기 점검용 모니터링 쿼리 (크론탭 또는 스케줄러 등록 권장)
SELECT segment_name,
       status,
       tablespace_name,
       ROUND(bytes / 1024 / 1024, 2) AS size_mb
FROM dba_rollback_segs
WHERE status != 'ONLINE'
  AND segment_name != 'SYSTEM';

관련 에러

  • ORA-01552: 시스템 롤백 세그먼트 외의 세그먼트를 사용할 수 없을 때 발생하며, ORA-01545와 함께 롤백 세그먼트 관련 문제에서 자주 동반됩니다.
  • ORA-30012: 언두 테이블스페이스를 삭제하거나 오프라인으로 전환할 수 없을 때 발생하는 에러로, AUM 환경에서의 언두 관리 문제와 연관됩니다.
  • ORA-01628: 롤백 세그먼트의 최대 익스텐트 수에 도달했을 때 발생하며, 롤백 세그먼트 용량 관련 문제로 ORA-01545 발생 이후 후속 조치 중 마주칠 수 있습니다.
  • ORA-00376: 파일을 현재 읽을 수 없는 상태일 때 발생하며, 언두 테이블스페이스 데이터파일의 오프라인 상태와 연계되어 나타날 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기