2026년 07월 21일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01534 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01534 rollback segment does not exist 는?
ORA-01534 에러는 Oracle 데이터베이스에서 특정 롤백 세그먼트(Rollback Segment)를 명시적으로 참조했을 때, 해당 롤백 세그먼트가 존재하지 않거나 접근할 수 없는 상태일 때 발생합니다. 주로 SET TRANSACTION USE ROLLBACK SEGMENT 구문이나 초기화 파라미터에서 존재하지 않는 롤백 세그먼트 이름을 지정했을 때 나타납니다. 이 에러는 Manual Undo Management 환경(RBS 방식)에서 주로 발생하며, Automatic Undo Management(AUM)로 전환된 현대 Oracle 환경에서도 레거시 스크립트나 잘못된 파라미터 설정으로 인해 여전히 마주칠 수 있습니다.
주요 발생 원인
- 존재하지 않는 롤백 세그먼트 이름 지정
가장 흔한 원인으로, 애플리케이션 또는 DBA 스크립트에서 SET TRANSACTION USE ROLLBACK SEGMENT rbs01 과 같이 특정 롤백 세그먼트 이름을 하드코딩했으나 실제 데이터베이스에 해당 세그먼트가 생성되어 있지 않은 경우입니다. 특히 운영 환경과 개발 환경 간의 롤백 세그먼트 구성이 다를 경우, 개발 환경에서 작성한 스크립트를 운영 환경에 그대로 배포할 때 자주 발생합니다.
ROLLBACK_SEGMENTS초기화 파라미터에 잘못된 세그먼트 등록
init.ora 또는 spfile의 ROLLBACK_SEGMENTS 파라미터에 실제로 존재하지 않는 롤백 세그먼트 이름이 등록되어 있는 경우, 데이터베이스 시작 시 또는 세그먼트를 ONLINE으로 전환하는 과정에서 ORA-01534가 발생합니다. 이는 데이터베이스 마이그레이션, 복구 후 재구성, 또는 단순 오탈자 입력 실수로 인해 발생할 수 있으며, 심각한 경우 데이터베이스 기동 자체가 실패할 수 있습니다.
- 롤백 세그먼트가 DROP되었거나 OFFLINE 상태인 경우
이전에 정상적으로 존재하던 롤백 세그먼트가 DBA에 의해 DROP ROLLBACK SEGMENT 명령으로 삭제되었거나, OFFLINE 상태로 전환된 경우에도 해당 세그먼트를 참조하는 트랜잭션이나 스크립트가 실행되면 ORA-01534가 발생합니다. 특히 Tablespace 재구성이나 공간 최적화 작업 후에 롤백 세그먼트를 재생성하지 않고 AUM으로 전환하는 과정에서 기존 레거시 코드와 충돌이 발생하는 경우가 많습니다.
해결 방법
1단계: 현재 롤백 세그먼트 현황 확인
먼저 데이터베이스에 실제로 존재하는 롤백 세그먼트 목록과 상태를 확인합니다.
-- 롤백 세그먼트 전체 목록 및 상태 조회
SELECT segment_name,
owner,
tablespace_name,
status,
initial_extent,
next_extent,
max_extents
FROM dba_rollback_segs
ORDER BY segment_name;
-- 현재 ONLINE 상태의 롤백 세그먼트만 조회
SELECT usn,
name,
status,
xacts,
rssize,
optsize
FROM v$rollstat rs
JOIN v$rollname rn ON rs.usn = rn.usn
ORDER BY name;
2단계: 원인별 해결책
원인 1 해결 – 존재하지 않는 세그먼트를 참조하는 경우
에러 메시지에서 언급된 세그먼트 이름이 실제로 존재하는지 확인 후, 없다면 생성하거나 스크립트에서 해당 구문을 제거합니다.
-- 롤백 세그먼트 신규 생성 (Manual Undo Management 환경)
-- 먼저 RBS용 Tablespace 확인 또는 생성
CREATE TABLESPACE rbs_tbs
DATAFILE '/u01/oradata/orcl/rbs01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
-- 롤백 세그먼트 생성
CREATE ROLLBACK SEGMENT rbs01
TABLESPACE rbs_tbs
STORAGE (
INITIAL 1M
NEXT 1M
MINEXTENTS 2
MAXEXTENTS UNLIMITED
OPTIMAL 10M
);
-- 생성 후 ONLINE으로 전환
ALTER ROLLBACK SEGMENT rbs01 ONLINE;
원인 2 해결 – 초기화 파라미터 수정
-- 현재 ROLLBACK_SEGMENTS 파라미터 확인
SHOW PARAMETER rollback_segments;
-- spfile 사용 시 파라미터 제거 또는 수정
-- (실제 존재하는 세그먼트 이름으로 교체)
ALTER SYSTEM SET rollback_segments = 'RBS01, RBS02'
SCOPE = SPFILE;
-- AUM(Automatic Undo Management) 환경으로 전환하는 경우
-- UNDO_MANAGEMENT를 AUTO로 변경하면 ROLLBACK_SEGMENTS 파라미터 불필요
ALTER SYSTEM SET undo_management = 'AUTO' SCOPE = SPFILE;
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS1' SCOPE = SPFILE;
-- 변경사항 적용을 위해 데이터베이스 재시작 필요
-- SHUTDOWN IMMEDIATE;
-- STARTUP;
-- Undo Tablespace 현황 확인 (AUM 환경)
SELECT tablespace_name,
status,
contents,
retention
FROM dba_tablespaces
WHERE contents = 'UNDO';
원인 3 해결 – OFFLINE 상태 롤백 세그먼트 복구
-- OFFLINE 상태인 롤백 세그먼트 확인
SELECT segment_name, status
FROM dba_rollback_segs
WHERE status = 'OFFLINE';
-- OFFLINE 세그먼트를 ONLINE으로 전환
ALTER ROLLBACK SEGMENT rbs01 ONLINE;
-- 더 이상 필요 없는 롤백 세그먼트는 정리
ALTER ROLLBACK SEGMENT rbs01 OFFLINE;
DROP ROLLBACK SEGMENT rbs01;
-- SET TRANSACTION 구문을 사용하는 레거시 코드 수정 예시
-- 수정 전 (에러 발생 가능):
-- SET TRANSACTION USE ROLLBACK SEGMENT rbs_old;
-- 수정 후 (AUM 환경에서는 해당 구문 제거):
-- AUM에서는 Oracle이 자동으로 Undo 세그먼트를 관리하므로
-- SET TRANSACTION USE ROLLBACK SEGMENT 구문 자체를 제거하거나 주석 처리
-- SET TRANSACTION READ WRITE; -- 또는 단순히 해당 라인 삭제
Undo Management 모드 확인 및 전환
-- 현재 Undo Management 방식 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('undo_management', 'undo_tablespace', 'rollback_segments');
-- AUM 환경에서 Undo Tablespace 공간 확인
SELECT a.tablespace_name,
ROUND(a.total_mb, 2) AS total_mb,
ROUND(b.used_mb, 2) AS used_mb,
ROUND(a.total_mb - b.used_mb, 2) AS free_mb,
ROUND(b.used_mb / a.total_mb * 100, 2) AS used_pct
FROM (
SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_data_files
WHERE tablespace_name = (SELECT value FROM v$parameter WHERE name = 'undo_tablespace')
GROUP BY tablespace_name
) a,
(
SELECT tablespace_name, SUM(bytes)/1024/1024 AS used_mb
FROM dba_undo_extents
WHERE status != 'EXPIRED'
GROUP BY tablespace_name
) b
WHERE a.tablespace_name = b.tablespace_name;
예방 방법
- Automatic Undo Management(AUM)으로 전환 및 레거시 코드 정리
Oracle 9i 이후부터는 Manual Undo Management(MUM) 방식보다 AUM 방식이 권장됩니다. UNDO_MANAGEMENT = AUTO 설정을 통해 Oracle이 자동으로 Undo 공간을 관리하도록 하면 ORA-01534와 같은 수동 롤백 세그먼트 관련 에러를 근본적으로 방지할 수 있습니다. 기존 애플리케이션 코드에 SET TRANSACTION USE ROLLBACK SEGMENT 구문이 존재한다면 코드 리뷰를 통해 해당 구문을 모두 제거하거나 무력화해야 하며, 이 작업을 형상관리 시스템에 반영하여 이후 배포 시 재유입되지 않도록 관리해야 합니다.
- 초기화 파라미터 및 롤백 세그먼트 구성 문서화와 정기 점검
ROLLBACK_SEGMENTS 파라미터에 등록된 모든 세그먼트가 실제로 존재하고 ONLINE 상태인지를 정기적으로 검증하는 점검 스크립트를 작성하여 DB 헬스체크 루틴에 포함시켜야 합니다. 환경 이전(마이그레이션), 복구 작업, 또는 스토리지 재구성 후에는 반드시 롤백 세그먼트 현황을 재확인하고, 변경 사항을 운영 매뉴얼과 형상관리 시스템에 동기화하여 담당자 교체나 야간 장애 대응 시에도 정확한 정보를 참조할 수 있도록 유지해야 합니다.
관련 에러
- ORA-01535:
rollback segment 'string' already exists— 이미 존재하는 이름으로 롤백 세그먼트를 생성하려 할 때 발생하며, ORA-01534와 반대 상황입니다. - ORA-01552:
cannot use system rollback segment for non-system tablespace 'string'— SYSTEM 롤백 세그먼트를 비시스템 트랜잭션에 사용하려 할 때 발생하며, 롤백 세그먼트 설정 부재와 관련됩니다. - ORA-30012:
undo tablespace 'string' does not exist or of wrong type— AUM 환경에서UNDO_TABLESPACE파라미터에 잘못된 Tablespace 이름이 지정되었을 때 발생하며, ORA-01534의 AUM 버전 대응 에러로 볼 수 있습니다. - ORA-01650 / ORA-01651: Undo Tablespace 공간 부족 관련 에러로, 롤백 세그먼트 관리 실패 시 연쇄적으로 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.