2026년 07월 25일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01562 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01562 failed to extend rollback segment number 는?
ORA-01562는 Oracle 데이터베이스에서 롤백 세그먼트(Rollback Segment)를 확장하려 할 때 공간이 부족하여 실패하는 에러입니다. 주로 대용량 DML(INSERT, UPDATE, DELETE) 트랜잭션이 수행될 때 Undo 데이터를 저장할 공간이 충분하지 않을 경우 발생합니다. 이 에러는 트랜잭션 자체를 롤백시키기 때문에 실무에서 매우 치명적인 에러 중 하나로 분류됩니다.
주요 발생 원인
- Undo Tablespace 또는 Rollback Segment의 물리적 공간 부족
Undo 데이터를 저장하는 Undo Tablespace의 가용 공간이 모두 소진된 경우 발생합니다. 대용량 배치 작업이나 다수의 동시 트랜잭션이 수행될 때 Undo 공간이 빠르게 소진될 수 있으며, 데이터 파일이 AUTOEXTEND OFF로 설정되어 있거나 디스크 여유 공간이 없는 경우 더욱 빈번하게 발생합니다.
- MAXEXTENTS 설정 한계 초과 (Manual Undo 환경)
Oracle 9i 이전 환경 또는 수동 롤백 세그먼트(Manual Undo)를 사용하는 환경에서는 개별 롤백 세그먼트에 MAXEXTENTS 파라미터가 설정됩니다. 롤백 세그먼트가 이 최대 익스텐트 수에 도달하면 더 이상 확장할 수 없게 되어 ORA-01562 에러가 발생합니다. 이 경우 세그먼트 자체의 설정 변경이 필요합니다.
- UNDO_RETENTION 설정과 Undo Tablespace 크기의 불균형
UNDO_RETENTION 파라미터 값이 크게 설정되어 있으면, 이미 커밋된 Undo 데이터도 일정 시간 동안 보존되어 Undo Tablespace를 점유합니다. 이 상태에서 신규 트랜잭션이 발생하면 실제 사용 가능한 공간이 부족해져 에러가 유발됩니다. Undo Tablespace 크기와 Retention 설정 사이의 균형이 맞지 않을 때 주로 발생합니다.
해결 방법
1. Undo Tablespace 데이터 파일 크기 확장
현재 Undo Tablespace의 사용 현황을 먼저 확인하고, 데이터 파일을 확장합니다.
-- Undo Tablespace 사용 현황 확인
SELECT
tablespace_name,
file_name,
bytes / 1024 / 1024 AS size_mb,
autoextensible,
maxbytes / 1024 / 1024 AS max_size_mb
FROM dba_data_files
WHERE tablespace_name = 'UNDOTBS1';
-- Undo Tablespace 사용률 상세 조회
SELECT
usn,
name,
extents,
rssize / 1024 / 1024 AS rssize_mb,
status
FROM v$rollstat rs, v$rollname rn
WHERE rs.usn = rn.usn;
-- 데이터 파일 크기 수동 확장
ALTER DATABASE DATAFILE '/oradata/ORCL/undotbs01.dbf' RESIZE 4096M;
-- AUTOEXTEND 활성화로 자동 확장 허용
ALTER DATABASE DATAFILE '/oradata/ORCL/undotbs01.dbf'
AUTOEXTEND ON NEXT 512M MAXSIZE 10240M;
-- 새 데이터 파일 추가
ALTER TABLESPACE UNDOTBS1
ADD DATAFILE '/oradata/ORCL/undotbs02.dbf' SIZE 2048M
AUTOEXTEND ON NEXT 512M MAXSIZE 10240M;
2. Manual Rollback Segment의 MAXEXTENTS 수정 (레거시 환경)
-- 현재 롤백 세그먼트 상태 조회
SELECT
segment_name,
tablespace_name,
initial_extent,
next_extent,
max_extents,
status
FROM dba_rollback_segs;
-- MAXEXTENTS 값 증가
ALTER ROLLBACK SEGMENT rbs01
STORAGE (MAXEXTENTS UNLIMITED);
-- 또는 특정 값으로 설정
ALTER ROLLBACK SEGMENT rbs01
STORAGE (MAXEXTENTS 4096);
-- 롤백 세그먼트 온라인 상태로 전환
ALTER ROLLBACK SEGMENT rbs01 ONLINE;
3. UNDO_RETENTION 조정 및 Undo 공간 강제 재사용 허용
-- 현재 Undo 관련 파라미터 확인
SHOW PARAMETER UNDO;
-- UNDO_RETENTION 값 줄이기 (초 단위, 기본 900초)
ALTER SYSTEM SET UNDO_RETENTION = 300 SCOPE=BOTH;
-- Retention 보장 해제 (Tablespace 속성 변경)
-- GUARANTEE 설정 시 활성 트랜잭션보다 Retention을 우선하여 공간 부족 유발 가능
ALTER TABLESPACE UNDOTBS1 RETENTION NOGUARANTEE;
-- 현재 활성 트랜잭션 및 Undo 사용 현황 점검
SELECT
s.sid,
s.serial#,
s.username,
t.used_ublk * 8 / 1024 AS undo_used_mb,
t.start_time,
s.status
FROM v$transaction t, v$session s
WHERE t.ses_addr = s.saddr
ORDER BY t.used_ublk DESC;
4. 대용량 트랜잭션 분할 처리 (애플리케이션 레벨)
-- 대용량 DELETE를 BULK 방식으로 분할 처리 예시
BEGIN
LOOP
DELETE FROM large_table
WHERE status = 'INACTIVE'
AND ROWNUM <= 10000;
EXIT WHEN SQL%ROWCOUNT = 0;
COMMIT; -- 주기적 커밋으로 Undo 공간 해제
END LOOP;
END;
/
-- 대용량 UPDATE 분할 처리
DECLARE
v_count NUMBER := 0;
BEGIN
FOR rec IN (SELECT rowid FROM target_table WHERE flag = 'N') LOOP
UPDATE target_table
SET flag = 'Y', updated_date = SYSDATE
WHERE rowid = rec.rowid;
v_count := v_count + 1;
IF MOD(v_count, 5000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
예방 방법
- Undo Tablespace 모니터링 자동화 및 임계치 알람 설정
Undo Tablespace의 사용률을 주기적으로 모니터링하는 스크립트를 cron job이나 Oracle Scheduler로 등록하여 70% 이상 사용 시 자동으로 알람을 발송하도록 구성합니다. 또한 AUTOEXTEND 옵션을 활성화하되 MAXSIZE를 디스크 여유 공간에 맞게 적절히 설정하여 무한 확장을 방지합니다.
“`sql
— Undo 사용률 모니터링 쿼리 (정기 실행 권장)
SELECT
a.tablespace_name,
ROUND((1 – (b.free_mb / a.total_mb)) * 100, 2) AS used_pct,
a.total_mb,
b.free_mb,
a.total_mb – b.free_mb AS used_mb
FROM
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS total_mb
FROM dba_data_files WHERE tablespace_name LIKE ‘UNDO%’
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space WHERE tablespace_name LIKE ‘UNDO%’
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
“`
- 배치 작업 설계 시 트랜잭션 크기 제한 및 주기적 COMMIT 전략 적용
대용량 배치 프로그램 개발 시 처음부터 일정 건수(예: 5,000~10,000건)마다 COMMIT을 수행하는 방식으로 설계합니다. 단, COMMIT 빈도가 너무 높으면 성능 저하가 발생할 수 있으므로 작업 특성에 맞는 적절한 배치 크기를 테스트를 통해 결정합니다. 이 전략은 ORA-01562뿐만 아니라 ORA-01555(Snapshot Too Old) 에러 방지에도 효과적입니다.
관련 에러
- ORA-01555 (Snapshot Too Old): Undo 데이터가 너무 빨리 덮어씌워져 일관된 읽기(Consistent Read)를 제공하지 못할 때 발생합니다. UNDO_RETENTION 설정과 밀접하게 연관됩니다.
- ORA-30036: Undo Tablespace에 세그먼트를 위한 공간을 확장할 수 없을 때 발생하며, Automatic Undo Management(AUM) 환경에서 ORA-01562와 유사한 상황에서 나타납니다.
- ORA-01650 / ORA-01652: 다른 Tablespace에서의 Temporary 또는 Rollback 세그먼트 확장 실패 에러로, 공간 부족이라는 근본 원인을 공유합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.