2026년 07월 25일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01595 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01595 error freeing extent of rollback segment 는?
ORA-01595 에러는 Oracle 데이터베이스가 롤백 세그먼트(Rollback Segment)의 익스텐트(Extent)를 해제하려는 과정에서 문제가 발생했을 때 나타나는 에러입니다. 롤백 세그먼트는 트랜잭션의 이전 이미지(Before Image)를 저장하고, 트랜잭션 롤백이나 읽기 일관성(Read Consistency)을 보장하기 위해 사용되는 핵심 구조물입니다. 이 에러는 주로 롤백 세그먼트의 익스텐트 해제 시 내부적인 손상이나 공간 관리 문제가 발생할 때 트리거되며, 방치할 경우 데이터베이스 가용성과 무결성에 심각한 영향을 미칠 수 있습니다.
주요 발생 원인
- 롤백 세그먼트 헤더 블록 손상 (Rollback Segment Header Corruption)
롤백 세그먼트의 헤더 블록이 손상된 경우, 익스텐트 해제 과정에서 Oracle이 정상적인 체인 정보를 읽지 못해 ORA-01595가 발생합니다. 이는 하드웨어 장애, 비정상적인 인스턴스 종료(예: kill -9), 또는 스토리지 레벨의 I/O 오류 등에 의해 유발될 수 있습니다. 헤더 블록이 손상되면 롤백 세그먼트 전체가 사용 불가 상태가 되며, 이를 참조하는 세션들도 연쇄적으로 오류를 경험하게 됩니다.
- 롤백 세그먼트의 OPTIMAL 파라미터 설정 문제
롤백 세그먼트에 OPTIMAL 파라미터가 설정되어 있을 때, Oracle은 주기적으로 익스텐트를 OPTIMAL 크기까지 자동으로 수축(Shrink)하려고 시도합니다. 이 수축 과정에서 익스텐트 해제에 실패하거나, OPTIMAL 값이 너무 작게 설정되어 과도한 수축이 반복되는 경우 ORA-01595가 유발될 수 있습니다. 특히 활성 트랜잭션이 있는 상태에서 수축이 발생하면 익스텐트 체인 정보와 실제 상태 간의 불일치가 생길 수 있습니다.
- 롤백 세그먼트 테이블스페이스의 공간 부족 또는 단편화
롤백 세그먼트가 위치한 테이블스페이스에 공간이 부족하거나 심한 단편화(Fragmentation)가 발생한 경우, 익스텐트를 해제하고 재구성하는 과정이 원활하지 않아 에러가 발생할 수 있습니다. 또한, 딕셔너리 관리 방식(Dictionary-Managed Tablespace)의 테이블스페이스에서는 FET$ 및 UET$ 딕셔너리 테이블에 대한 공간 정보 업데이트가 실패하면 이 에러로 이어지기도 합니다.
해결 방법
1. 문제가 되는 롤백 세그먼트 식별
먼저 어느 롤백 세그먼트에서 문제가 발생하고 있는지 확인합니다.
-- 현재 롤백 세그먼트 상태 확인
SELECT segment_name,
status,
extents,
rssize,
optsize,
hwmsize,
xacts,
waits,
gets,
shrinks,
wraps
FROM v$rollstat rs,
v$rollname rn
WHERE rs.usn = rn.usn
ORDER BY segment_name;
-- DBA_ROLLBACK_SEGS 뷰를 통한 상태 점검
SELECT segment_name,
owner,
tablespace_name,
segment_id,
file_id,
block_id,
initial_extent,
next_extent,
min_extents,
max_extents,
status
FROM dba_rollback_segs
ORDER BY segment_name;
2. 문제 롤백 세그먼트를 OFFLINE으로 전환
ORA-01595가 발생하는 특정 롤백 세그먼트를 즉시 OFFLINE 처리하여 추가 피해를 방지합니다.
-- 롤백 세그먼트를 오프라인으로 전환
ALTER ROLLBACK SEGMENT rbs_problematic OFFLINE;
-- 오프라인 상태 확인
SELECT segment_name, status
FROM dba_rollback_segs
WHERE segment_name = 'RBS_PROBLEMATIC';
3. OPTIMAL 파라미터 조정 또는 제거
OPTIMAL 파라미터로 인한 과도한 수축이 원인인 경우, 이를 조정하거나 제거합니다.
-- OPTIMAL 파라미터 제거 (수축 비활성화)
ALTER ROLLBACK SEGMENT rbs_problematic STORAGE (OPTIMAL UNLIMITED);
-- 또는 적절한 크기로 OPTIMAL 재설정
-- 현재 HWM(High Water Mark)보다 충분히 큰 값으로 설정
ALTER ROLLBACK SEGMENT rbs_normal STORAGE (OPTIMAL 100M);
-- 롤백 세그먼트 재생성 (DROP 후 CREATE)
DROP ROLLBACK SEGMENT rbs_problematic;
CREATE ROLLBACK SEGMENT rbs_new
TABLESPACE rbs_tablespace
STORAGE (
INITIAL 1M
NEXT 1M
MINEXTENTS 2
MAXEXTENTS UNLIMITED
OPTIMAL UNLIMITED
);
-- 새로 생성된 롤백 세그먼트 온라인 전환
ALTER ROLLBACK SEGMENT rbs_new ONLINE;
4. 테이블스페이스 공간 확보 및 단편화 해소
-- 롤백 세그먼트 테이블스페이스의 공간 현황 점검
SELECT tablespace_name,
file_id,
block_id,
bytes / 1024 / 1024 AS free_mb,
blocks,
relative_fno
FROM dba_free_space
WHERE tablespace_name = 'RBS'
ORDER BY bytes DESC;
-- 테이블스페이스에 데이터파일 추가 (공간 부족 시)
ALTER TABLESPACE rbs
ADD DATAFILE '/oracle/oradata/orcl/rbs02.dbf'
SIZE 500M
AUTOEXTEND ON
NEXT 100M
MAXSIZE 2G;
-- 단편화 현황 확인 (Free Space 조각 수 확인)
SELECT tablespace_name,
COUNT(*) AS free_chunks,
SUM(bytes) / 1024 / 1024 AS total_free_mb,
MAX(bytes) / 1024 / 1024 AS largest_chunk_mb
FROM dba_free_space
WHERE tablespace_name = 'RBS'
GROUP BY tablespace_name;
5. Alert Log 및 Trace 파일 분석
Oracle Alert Log를 통해 정확한 에러 맥락과 손상된 블록 주소를 파악합니다.
-- Alert Log 위치 확인
SELECT value
FROM v$parameter
WHERE name = 'background_dump_dest';
-- 또는 ADR(Automatic Diagnostic Repository) 경로 확인 (11g 이상)
SELECT value
FROM v$diag_info
WHERE name = 'Diag Trace';
-- 특정 롤백 세그먼트의 헤더 블록 정보 확인
SELECT segment_name,
file_id,
block_id,
header_block
FROM dba_rollback_segs
WHERE status != 'OFFLINE';
6. UNDO 테이블스페이스 사용 권장 (9i 이상)
Oracle 9i 이후에는 수동 롤백 세그먼트 방식보다 자동 UNDO 관리(AUM) 방식을 사용하는 것이 근본적인 해결책입니다.
-- 현재 UNDO 관리 방식 확인
SHOW PARAMETER undo_management;
-- UNDO 테이블스페이스 생성
CREATE UNDO TABLESPACE undotbs2
DATAFILE '/oracle/oradata/orcl/undotbs02.dbf'
SIZE 1G
AUTOEXTEND ON
NEXT 200M
MAXSIZE 10G;
-- UNDO 테이블스페이스로 전환
ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO SCOPE=SPFILE;
ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS2 SCOPE=SPFILE;
-- UNDO RETENTION 파라미터 조정 (초 단위, 기본 900초)
ALTER SYSTEM SET UNDO_RETENTION = 3600 SCOPE=BOTH;
-- UNDO 테이블스페이스 사용 현황 점검
SELECT tablespace_name,
status,
SUM(bytes) / 1024 / 1024 AS total_mb
FROM dba_undo_extents
GROUP BY tablespace_name, status
ORDER BY tablespace_name, status;
예방 방법
- 자동 UNDO 관리(AUM) 방식으로 전환 및 정기 모니터링
Oracle 9i 이상 환경에서는 수동 롤백 세그먼트 관리 방식(Manual Undo Management)을 사용하지 않고, 자동 UNDO 관리 방식(Automatic Undo Management)으로 전환하는 것을 강력히 권장합니다. AUM을 사용하면 Oracle이 UNDO 세그먼트의 생성, 관리, 공간 재사용을 자동으로 처리하므로 ORA-01595와 같은 수동 관리에서 발생하는 에러 위험을 원천 차단할 수 있습니다. 또한 UNDO 테이블스페이스의 사용량을 정기적으로 모니터링하는 스크립트를 스케줄러(DBMS_SCHEDULER)에 등록하여 공간 부족 상황을 사전에 감지하고 대응하는 체계를 마련하세요.
“`sql
— UNDO 공간 모니터링 스크립트 (정기 실행 권장)
SELECT TO_CHAR(begin_time, ‘YYYY-MM-DD HH24:MI’) AS begin_time,
TO_CHAR(end_time, ‘YYYY-MM-DD HH24:MI’) AS end_time,
undoblks,
txncount,
maxquerylen,
maxconcurrency,
unxpstealcnt,
expstealcnt,
ssolderrcnt
FROM v$undostat
ORDER BY begin_time DESC
FETCH FIRST 24 ROWS ONLY;
“`
- Alert Log 실시간 모니터링 및 백업 정책 강화
ORA-01595와 같은 에러는 사전 징후 없이 갑자기 발생하는 경우도 있지만, Alert Log를 실시간으로 모니터링하면 초기 경고 신호(예: ORA-01555, ORA-01560 등의 관련 에러)를 조기에 포착할 수 있습니다. RMAN(Recovery Manager)을 활용한 정기 전체 백업(Full Backup) 및 증분 백업(Incremental Backup) 정책을 수립하고, 특히 SYSTEM, UNDO/RBS 테이블스페이스에 대한 백업을 우선시하여 손상 발생 시 신속하게 복구할 수 있는 환경을 구축하세요. 또한 Data Guard와 같은 고가용성 솔루션을 적용하여 Primary 데이터베이스 장애 시 자동 Failover가 가능하도록 준비하는 것도 장기적인 예방 전략으로 매우 효과적입니다.
“`sql
— RMAN을 이용한 UNDO 테이블스페이스 백업 예시
— RMAN 프롬프트에서 실행
/*
RMAN> BACKUP TABLESPACE undotbs1
FORMAT ‘/backup/rman/%d_%T_%U.bkp’
TAG ‘UNDO_BACKUP’;
*/
— Alert Log 위치 확인 및 최근 에러 조회 (12c 이상 V$DIAG_ALERT_EXT 활용)
SELECT originating_timestamp,
message_text
FROM v$diag_alert_ext
WHERE message_text LIKE ‘%ORA-%’
AND originating_timestamp > SYSDATE – 1
ORDER BY originating_timestamp DESC;
“`
관련 에러
- ORA-01560: 롤백 세그먼트 익스텐트 할당 실패로, ORA-01595와 함께 나타나는 경우가 많으며 RBS 테이블스페이스 공간 부족과 직접적으로 연관됩니다.
- ORA-01555 (Snapshot too old): UNDO/롤백 세그먼트의 공간이 부족하거나 너무 빠르게 재사용될 때 발생하며, ORA-01595의 근본적인 UNDO 관리 문제와 밀접하게 연관됩니다.
- ORA-00376 / ORA-01110: 데이터파일 읽기 불가 에러로, 롤백 세그먼트가 위치한 데이터파일이 손상되었을 때 ORA-01595와 동반하여 나타날 수 있습니다.
- ORA-01562: 롤백 세그먼트 확장 실패 에러로, MAXEXTENTS 초과 또는 테이블스페이스 공간 부족 시 발생하며 ORA-01595와 유사한 환경에서 발생합니다.
- ORA-00604: 재귀 SQL(Recursive SQL) 레벨에서 발생하는 에러로, 롤백 세그먼트의 딕셔너리 정보 업데이트 실패 시 ORA-01595와 함께 Alert Log에 기록되기도 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.