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

ORA-01552
2026년 07월 24일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-01552 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-01552 cannot use system rollback segment for non-system tablespace 는?

ORA-01552 에러는 Oracle 데이터베이스에서 비시스템(non-system) 테이블스페이스에 대한 DML 또는 DDL 작업을 수행할 때, 사용 가능한 롤백 세그먼트(Undo 세그먼트)가 없거나 SYSTEM 롤백 세그먼트만 존재하는 경우 발생합니다. Oracle은 SYSTEM 롤백 세그먼트를 일반 사용자 트랜잭션에 사용하는 것을 허용하지 않으며, 이를 위반할 경우 해당 에러를 반환합니다. 주로 Undo 테이블스페이스가 제대로 구성되지 않았거나, 데이터베이스 마이그레이션, 복구 작업, 또는 초기 설정 오류 상황에서 빈번하게 나타납니다.


주요 발생 원인

1. Undo 테이블스페이스가 없거나 비활성 상태인 경우

자동 Undo 관리(AUM, Automatic Undo Management) 모드에서 UNDO_TABLESPACE 파라미터가 잘못 설정되어 있거나, 지정된 Undo 테이블스페이스가 존재하지 않을 때 이 에러가 발생합니다. 데이터베이스가 기동될 때 유효한 Undo 테이블스페이스를 찾지 못하면 Oracle은 SYSTEM 롤백 세그먼트를 사용하려 하지만, 비시스템 객체에 대해서는 이를 허용하지 않아 에러가 발생합니다.

2. UNDO_MANAGEMENT 파라미터 설정 오류

UNDO_MANAGEMENT 파라미터가 AUTO로 설정되어 있어야 하는데, MANUAL로 설정되어 있거나 아예 누락된 경우에도 이 에러가 발생할 수 있습니다. MANUAL 모드에서는 사용자가 직접 롤백 세그먼트를 생성하고 온라인 상태로 유지해야 하는데, 적절한 롤백 세그먼트가 없으면 결국 SYSTEM 롤백 세그먼트로만 동작하게 되어 에러가 유발됩니다.

3. 데이터베이스 복구 또는 불완전한 마이그레이션 이후 Undo 세그먼트 손실

데이터베이스 복구 작업, 업그레이드, 또는 클론 작업 이후에 Undo 테이블스페이스 또는 롤백 세그먼트가 유실되거나 OFFLINE 상태가 될 수 있습니다. 이런 경우 기존 Undo 세그먼트를 참조하는 파라미터 파일(SPFILE/PFILE)의 설정이 실제 데이터베이스 상태와 일치하지 않아 에러가 반복적으로 발생하게 됩니다.


해결 방법

해결책 1: 현재 Undo 관련 설정 및 상태 확인

가장 먼저 현재 Undo 설정 상태를 점검해야 합니다.

-- 현재 Undo 관련 파라미터 확인
SHOW PARAMETER UNDO;

-- 또는 v$parameter 뷰를 통해 확인
SELECT name, value
FROM   v$parameter
WHERE  name IN ('undo_management', 'undo_tablespace', 'undo_retention');

-- 현재 Undo 테이블스페이스 존재 여부 및 상태 확인
SELECT tablespace_name, status, contents
FROM   dba_tablespaces
WHERE  contents = 'UNDO';

-- 롤백 세그먼트 상태 확인
SELECT segment_name, tablespace_name, status
FROM   dba_rollback_segs;

해결책 2: Undo 테이블스페이스 생성 및 활성화

Undo 테이블스페이스가 없는 경우 새로 생성합니다.

-- Undo 테이블스페이스 생성
CREATE UNDO TABLESPACE UNDOTBS1
  DATAFILE '/u01/app/oracle/oradata/ORCL/undotbs01.dbf'
  SIZE 500M
  AUTOEXTEND ON
  NEXT 100M
  MAXSIZE 2G;

-- 생성 후 파라미터 설정 (동적 변경)
ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS1 SCOPE=BOTH;

-- UNDO_MANAGEMENT가 MANUAL인 경우 AUTO로 변경 (재기동 필요)
ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO SCOPE=SPFILE;
-- 변경 후 데이터베이스 재기동 필요
SHUTDOWN IMMEDIATE;
STARTUP;

해결책 3: MANUAL 모드에서 롤백 세그먼트 수동 생성 및 온라인

UNDO_MANAGEMENT=MANUAL 환경을 유지해야 하는 경우, 사용자 롤백 세그먼트를 직접 생성하고 온라인 상태로 만들어야 합니다.

-- 롤백 세그먼트용 테이블스페이스 생성 (없는 경우)
CREATE TABLESPACE RBS_TS
  DATAFILE '/u01/app/oracle/oradata/ORCL/rbs01.dbf'
  SIZE 200M;

-- 롤백 세그먼트 생성
CREATE ROLLBACK SEGMENT RBS1
  TABLESPACE RBS_TS
  STORAGE (
    INITIAL    512K
    NEXT       512K
    MINEXTENTS 2
    MAXEXTENTS UNLIMITED
  );

-- 롤백 세그먼트 온라인 활성화
ALTER ROLLBACK SEGMENT RBS1 ONLINE;

-- 상태 확인
SELECT segment_name, status
FROM   dba_rollback_segs
WHERE  segment_name = 'RBS1';

-- init.ora 또는 SPFILE에 롤백 세그먼트 등록 (재기동 후에도 유지)
ALTER SYSTEM SET ROLLBACK_SEGMENTS = RBS1 SCOPE=SPFILE;

해결책 4: 기존 Undo 테이블스페이스가 OFFLINE인 경우 복구

-- Undo 테이블스페이스 상태 확인
SELECT tablespace_name, status
FROM   dba_tablespaces
WHERE  contents = 'UNDO';

-- OFFLINE 상태인 경우 ONLINE으로 변경
ALTER TABLESPACE UNDOTBS1 ONLINE;

-- 데이터파일 상태도 함께 확인
SELECT file_name, status, online_status
FROM   dba_data_files
WHERE  tablespace_name = 'UNDOTBS1';

예방 방법

1. Undo 테이블스페이스 모니터링 자동화 및 충분한 용량 확보

Undo 테이블스페이스의 사용량을 정기적으로 모니터링하고, 자동 확장(AUTOEXTEND)을 활성화하여 공간 부족으로 인한 장애를 사전에 방지해야 합니다. 또한 아래와 같은 쿼리를 스케줄러 잡으로 등록하여 임계치 초과 시 알람을 받는 체계를 구성하는 것이 실무에서 매우 효과적입니다.

-- Undo 사용률 모니터링 쿼리 (정기 실행 권장)
SELECT tablespace_name,
       ROUND(used_space * 8192 / 1024 / 1024, 2)       AS used_mb,
       ROUND(tablespace_size * 8192 / 1024 / 1024, 2)  AS total_mb,
       ROUND(used_percent, 2)                           AS used_pct
FROM   dba_undo_extents_summary  -- 버전에 따라 뷰 상이할 수 있음
;

-- 대안: dba_data_files + dba_free_space 활용
SELECT df.tablespace_name,
       ROUND(df.bytes / 1024 / 1024, 2)                          AS total_mb,
       ROUND((df.bytes - NVL(fs.bytes, 0)) / 1024 / 1024, 2)    AS used_mb,
       ROUND(NVL(fs.bytes, 0) / 1024 / 1024, 2)                 AS free_mb
FROM  (SELECT tablespace_name, SUM(bytes) bytes
       FROM   dba_data_files
       WHERE  tablespace_name = 'UNDOTBS1'
       GROUP BY tablespace_name) df,
      (SELECT tablespace_name, SUM(bytes) bytes
       FROM   dba_free_space
       WHERE  tablespace_name = 'UNDOTBS1'
       GROUP BY tablespace_name) fs
WHERE  df.tablespace_name = fs.tablespace_name(+);

2. 데이터베이스 기동 시 파라미터 파일 검증 절차 의무화

데이터베이스 마이그레이션, 클론, 복구 후에는 반드시 SPFILE/PFILE의 UNDO_MANAGEMENT, UNDO_TABLESPACE 파라미터 값이 실제 데이터베이스 구성과 일치하는지 검증하는 체크리스트를 운영 절차에 포함시켜야 합니다. 특히 Data Guard 환경이나 RMAN 복구 후에는 Undo 설정이 원본과 달라질 수 있으므로, 기동 전 반드시 v$parameterdba_tablespaces를 교차 확인하는 습관을 갖추는 것이 중요합니다.


관련 에러

  • ORA-01555 (snapshot too old): Undo 보존 기간(UNDO_RETENTION)이 너무 짧아 읽기 일관성을 위한 이전 이미지가 덮어씌워진 경우 발생하며, Undo 공간 부족과 밀접하게 연관됩니다.
  • ORA-30036 (unable to extend segment in undo tablespace): Undo 테이블스페이스의 공간이 부족하여 세그먼트를 확장하지 못할 때 발생하며, ORA-01552와 함께 자주 목격되는 에러입니다.
  • ORA-01650 / ORA-01651: 롤백 세그먼트 확장 실패와 관련된 에러로, MANUAL 모드에서 롤백 세그먼트 크기 제한에 걸렸을 때 나타납니다.
  • ORA-00376: 데이터파일이 현재 읽힐 수 없는 상태일 때 발생하며, Undo 데이터파일이 OFFLINE 또는 손상된 경우 ORA-01552와 연쇄적으로 발생할 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기