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

ORA-01562
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 에러 코드 시리즈

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

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

댓글 남기기