2026년 07월 21일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01524 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01524 cannot create rollback segment – public rollback segment exists 는?
ORA-01524 에러는 Oracle 데이터베이스에서 새로운 롤백 세그먼트(Rollback Segment)를 생성하려고 할 때, 동일한 이름의 퍼블릭(Public) 롤백 세그먼트가 이미 존재하는 경우 발생하는 에러입니다. 롤백 세그먼트는 트랜잭션의 이전 데이터(Before Image)를 저장하여 롤백 연산과 읽기 일관성을 보장하는 중요한 데이터베이스 오브젝트입니다. 주로 레거시 Oracle 환경(Oracle 9i 이전)에서 수동으로 롤백 세그먼트를 관리하거나, RAC(Real Application Clusters) 환경에서 세그먼트를 재구성할 때 자주 마주치는 에러입니다.
주요 발생 원인
- 동일한 이름의 퍼블릭 롤백 세그먼트가 이미 존재하는 경우
가장 흔한 원인입니다. DBA가 기존에 퍼블릭 롤백 세그먼트를 생성해 두었으나, 이를 인지하지 못하고 동일한 이름으로 다시 생성하려 할 때 발생합니다. 퍼블릭 롤백 세그먼트는 DBA_ROLLBACK_SEGS 뷰에서 OWNER = 'PUBLIC'으로 조회됩니다. 특히 여러 DBA가 관리하는 환경이나 운영 이관 작업 중에 이미 생성된 오브젝트를 간과하는 경우가 많습니다.
- RAC 환경에서 노드별 롤백 세그먼트 재생성 시 충돌
Oracle RAC 환경에서는 각 인스턴스가 고유한 프라이빗(Private) 롤백 세그먼트를 사용하거나, 퍼블릭 롤백 세그먼트를 공유하는 방식으로 구성될 수 있습니다. 한 노드에서 장애 복구 또는 재구성 작업 중 이미 다른 노드에 의해 퍼블릭 롤백 세그먼트가 등록된 상태에서 동일한 이름으로 생성을 시도하면 이 에러가 발생합니다. 이 경우 클러스터 전체의 롤백 세그먼트 현황을 반드시 먼저 확인해야 합니다.
- 불완전한 드롭(DROP) 후 재생성 시도
롤백 세그먼트를 DROP하는 과정에서 오류가 발생하거나, 세그먼트가 NEEDS RECOVERY 또는 PARTLY AVAILABLE 상태로 남아 있을 때, 동일한 이름으로 재생성을 시도하면 이 에러가 발생할 수 있습니다. 내부적으로 데이터 딕셔너리에 해당 세그먼트 정보가 잔존하기 때문에 Oracle은 해당 이름이 이미 사용 중이라고 판단합니다. 이 경우 DBA_ROLLBACK_SEGS에서 상태를 확인하고 적절한 조치를 취해야 합니다.
해결 방법
1단계: 현재 롤백 세그먼트 현황 확인
가장 먼저 데이터베이스에 존재하는 모든 롤백 세그먼트의 이름, 소유자, 상태를 조회합니다.
-- 전체 롤백 세그먼트 조회
SELECT segment_name,
owner,
tablespace_name,
status,
initial_extent,
next_extent
FROM dba_rollback_segs
ORDER BY owner, segment_name;
이 쿼리를 통해 동일한 이름의 퍼블릭 롤백 세그먼트가 존재하는지 확인할 수 있습니다.
2단계: 기존 퍼블릭 롤백 세그먼트 오프라인 처리 후 드롭
이미 존재하는 퍼블릭 롤백 세그먼트를 삭제해야 새 세그먼트를 생성할 수 있습니다. 먼저 OFFLINE으로 전환한 후 DROP합니다.
-- 롤백 세그먼트를 오프라인으로 변경
ALTER ROLLBACK SEGMENT rbs_public_01 OFFLINE;
-- 롤백 세그먼트 드롭
DROP PUBLIC ROLLBACK SEGMENT rbs_public_01;
> ⚠️ 주의: 롤백 세그먼트를 드롭하기 전에 해당 세그먼트를 사용 중인 활성 트랜잭션이 없는지 반드시 확인하십시오.
3단계: 활성 트랜잭션 확인
롤백 세그먼트에 연결된 활성 트랜잭션이 있는지 확인합니다.
-- 특정 롤백 세그먼트를 사용하는 활성 트랜잭션 확인
SELECT s.sid,
s.serial#,
s.username,
t.xidusn,
t.used_ublk,
t.status
FROM v$session s,
v$transaction t
WHERE s.taddr = t.addr
AND t.xidusn = (
SELECT segment_id
FROM dba_rollback_segs
WHERE segment_name = 'RBS_PUBLIC_01'
);
활성 트랜잭션이 없음을 확인한 후 드롭을 진행합니다.
4단계: 정상적인 롤백 세그먼트 재생성
기존 세그먼트를 드롭한 후 원하는 사양으로 새 롤백 세그먼트를 생성합니다.
-- 퍼블릭 롤백 세그먼트 생성
CREATE PUBLIC ROLLBACK SEGMENT rbs_public_01
TABLESPACE rbs_tablespace
STORAGE (
INITIAL 1M
NEXT 1M
MINEXTENTS 2
MAXEXTENTS UNLIMITED
OPTIMAL 4M
);
-- 생성 후 온라인으로 변경
ALTER ROLLBACK SEGMENT rbs_public_01 ONLINE;
5단계: NEEDS RECOVERY 상태인 경우 처리
롤백 세그먼트가 NEEDS RECOVERY 상태로 남아 있는 경우에는 init.ora 또는 spfile에 해당 세그먼트를 오프라인으로 설정한 뒤 재기동합니다.
-- spfile 파라미터 확인
SHOW PARAMETER _OFFLINE_ROLLBACK_SEGMENTS;
-- 문제가 되는 세그먼트를 오프라인 파라미터로 추가
ALTER SYSTEM SET "_OFFLINE_ROLLBACK_SEGMENTS" = 'RBS_PUBLIC_01' SCOPE=SPFILE;
-- 데이터베이스 재기동 후 드롭
STARTUP MOUNT;
ALTER DATABASE OPEN;
DROP PUBLIC ROLLBACK SEGMENT rbs_public_01;
예방 방법
- 롤백 세그먼트 생성 전 표준화된 사전 점검 절차 수립
롤백 세그먼트를 생성하기 전에 반드시 DBA_ROLLBACK_SEGS를 조회하여 동일한 이름이 존재하는지 확인하는 것을 팀 내 표준 작업 절차(SOP)로 문서화하십시오. 특히 여러 명의 DBA가 동일한 환경을 관리하는 경우, 변경 관리 시스템(ITSM)을 통해 롤백 세그먼트 생성·삭제 이력을 반드시 기록하고 공유해야 합니다. 또한 Oracle 10g 이상 환경에서는 가급적 자동 언두 관리(Automatic Undo Management, AUM)를 사용하여 수동 롤백 세그먼트 관리의 복잡성을 원천적으로 제거하는 것이 최선입니다.
“`sql
— 사전 점검 스크립트 예시
SELECT COUNT(*)
FROM dba_rollback_segs
WHERE segment_name = UPPER(‘&new_rollback_segment_name’)
AND owner = ‘PUBLIC’;
— 결과가 0이 아니면 생성 중단
“`
- Oracle 10g 이상 환경에서는 Automatic Undo Management(AUM) 사용
Oracle 10g 이후부터는 수동 롤백 세그먼트 관리 방식 대신 자동 언두 관리 방식을 강력히 권장합니다. UNDO_MANAGEMENT = AUTO로 설정하고 언두 테이블스페이스를 할당하면, Oracle이 자동으로 언두 세그먼트를 생성·관리하므로 ORA-01524와 같은 수동 관리 관련 에러를 원천적으로 방지할 수 있습니다.
“`sql
— 현재 언두 관리 방식 확인
SHOW PARAMETER UNDO_MANAGEMENT;
SHOW PARAMETER UNDO_TABLESPACE;
— AUM으로 전환 (spfile 사용 시)
ALTER SYSTEM SET UNDO_MANAGEMENT = ‘AUTO’ SCOPE=SPFILE;
ALTER SYSTEM SET UNDO_TABLESPACE = ‘UNDOTBS1’ SCOPE=SPFILE;
— 변경 후 데이터베이스 재기동 필요
“`
관련 에러
- ORA-01534: 롤백 세그먼트가 존재하지 않을 때 발생 (
rollback segment 'string' doesn't exist) - ORA-01545: 롤백 세그먼트를 온라인으로 변경하려 할 때 이미 사용 불가능한 상태인 경우 발생 (
rollback segment 'string' specified not available) - ORA-30036: 자동 언두 관리(AUM) 환경에서 언두 테이블스페이스의 공간이 부족할 때 발생 (
unable to extend segment by 'string' in undo tablespace 'string') - ORA-01555: 스냅샷이 너무 오래되어 읽기 일관성을 보장할 수 없을 때 발생하는 에러로, 롤백/언두 세그먼트 크기와 밀접한 관련이 있습니다 (
snapshot too old)
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.