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

ORA-01549
2026년 07월 23일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01549 tablespace not empty, use INCLUDING CONTENTS option 는?

ORA-01549 에러는 Oracle 데이터베이스에서 DROP TABLESPACE 명령을 실행할 때, 해당 테이블스페이스 안에 아직 오브젝트(테이블, 인덱스, 뷰 등)나 데이터가 남아 있는 경우에 발생합니다. Oracle은 기본적으로 안전 장치로서 내용물이 존재하는 테이블스페이스를 바로 삭제하지 못하도록 막고 있으며, 이를 강제로 삭제하려면 추가 옵션을 명시적으로 사용해야 합니다. 즉, 이 에러는 “테이블스페이스가 비어 있지 않으니, INCLUDING CONTENTS 옵션을 사용하라”는 Oracle의 경고 메시지입니다.


주요 발생 원인

1. 테이블스페이스 내에 세그먼트(오브젝트)가 존재하는 경우

가장 일반적인 원인으로, 테이블, 인덱스, LOB 세그먼트, 파티션 등 다양한 오브젝트가 해당 테이블스페이스에 남아 있을 때 발생합니다. DBA가 테이블스페이스를 삭제하기 전에 내부 오브젝트를 먼저 제거하지 않았거나, 다른 스키마에서 해당 테이블스페이스를 참조하고 있는 경우가 대표적입니다. 실무에서는 여러 개발자가 공용 테이블스페이스를 사용하는 환경에서 특히 자주 발생합니다.

2. 언두(Undo) 또는 임시(Temp) 세그먼트가 남아 있는 경우

트랜잭션이 완전히 커밋되지 않았거나, 임시 테이블스페이스에 정렬(Sort) 또는 임시 작업 데이터가 남아 있을 경우에도 이 에러가 발생할 수 있습니다. 특히 사용자 정의 UNDO 테이블스페이스나 임시 테이블스페이스를 삭제하려 할 때 잔존 세그먼트로 인해 발생하는 경우가 많습니다. 세션이 활성화된 상태에서 강제로 삭제를 시도하는 상황에서도 동일한 에러가 나타납니다.

3. 데이터파일과 오브젝트 간 불일치 또는 잔존 데이터파일

특정 상황에서는 오브젝트는 이미 삭제되었음에도 불구하고, 데이터딕셔너리(Data Dictionary)에 메타데이터가 남아 있어 Oracle이 테이블스페이스를 비어있지 않다고 인식하는 경우가 있습니다. 또한 테이블스페이스에 여러 데이터파일이 연결되어 있고, 일부 데이터파일에만 오브젝트가 남아 있는 경우에도 동일한 에러가 발생할 수 있습니다. 이는 데이터딕셔너리와 실제 파일 시스템 간의 불일치에서 비롯되는 경우가 많습니다.


해결 방법

해결책 1: INCLUDING CONTENTS 옵션을 사용하여 강제 삭제

테이블스페이스 내의 모든 오브젝트와 함께 삭제하고자 할 때 사용합니다. AND DATAFILES 옵션을 추가하면 OS 레벨의 데이터파일까지 함께 삭제됩니다. 주의: 이 명령은 되돌릴 수 없으므로 반드시 백업 후 실행하세요.

-- 테이블스페이스 내 오브젝트만 포함하여 삭제
DROP TABLESPACE my_tablespace INCLUDING CONTENTS;

-- 테이블스페이스 내 오브젝트 및 OS 데이터파일까지 함께 삭제
DROP TABLESPACE my_tablespace INCLUDING CONTENTS AND DATAFILES;

-- 다른 테이블스페이스의 오브젝트가 참조하는 경우 CASCADE CONSTRAINTS 추가
DROP TABLESPACE my_tablespace INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;

해결책 2: 테이블스페이스 내 오브젝트를 먼저 수동으로 삭제

테이블스페이스 안에 어떤 오브젝트가 있는지 확인하고, 직접 삭제한 뒤 테이블스페이스를 제거하는 방법입니다.

-- 1단계: 테이블스페이스 내 오브젝트 조회
SELECT owner, segment_name, segment_type, bytes/1024/1024 AS size_mb
FROM dba_segments
WHERE tablespace_name = 'MY_TABLESPACE'
ORDER BY segment_type, owner, segment_name;

-- 2단계: 특정 오브젝트 삭제 (예: 테이블)
DROP TABLE schema_name.table_name PURGE;

-- 3단계: 인덱스 삭제
DROP INDEX schema_name.index_name;

-- 4단계: 오브젝트가 모두 제거되었는지 확인
SELECT COUNT(*)
FROM dba_segments
WHERE tablespace_name = 'MY_TABLESPACE';

-- 5단계: 테이블스페이스 삭제
DROP TABLESPACE MY_TABLESPACE INCLUDING CONTENTS AND DATAFILES;

해결책 3: 임시/언두 테이블스페이스 삭제 시 처리 방법

임시 또는 언두 테이블스페이스는 먼저 다른 테이블스페이스로 전환한 뒤 삭제해야 합니다.

-- 임시 테이블스페이스 기본값 변경 후 삭제
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;

-- 임시 세그먼트 확인
SELECT * FROM v$sort_segment WHERE tablespace_name = 'OLD_TEMP';

-- 임시 테이블스페이스 삭제
DROP TABLESPACE old_temp INCLUDING CONTENTS AND DATAFILES;

-- 언두 테이블스페이스 전환 후 삭제
ALTER SYSTEM SET undo_tablespace = 'UNDOTBS2';

-- 기존 언두 트랜잭션 완료 대기 후 삭제
DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

해결책 4: 데이터딕셔너리 불일치 확인 및 처리

-- 익스텐트 레벨에서 실제 사용 현황 확인
SELECT segment_name, segment_type, owner, extents, bytes
FROM dba_extents
WHERE tablespace_name = 'MY_TABLESPACE';

-- 데이터파일 목록 확인
SELECT file_id, file_name, bytes/1024/1024 AS size_mb, status
FROM dba_data_files
WHERE tablespace_name = 'MY_TABLESPACE';

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

예방 방법

1. 삭제 전 반드시 사전 점검 스크립트를 실행하라

테이블스페이스를 삭제하기 전에 항상 내부 오브젝트, 사용 용량, 참조 관계를 확인하는 사전 점검 절차를 운영 표준(SOP)으로 정착시키는 것이 중요합니다. 아래와 같이 삭제 대상 테이블스페이스에 대한 종합 점검 쿼리를 실행하여 영향도를 분석한 뒤 삭제를 진행하는 습관을 들여야 합니다.

-- 테이블스페이스 삭제 전 종합 점검 쿼리
SELECT 'SEGMENTS' AS check_type, COUNT(*) AS cnt
FROM dba_segments WHERE tablespace_name = 'TARGET_TS'
UNION ALL
SELECT 'DATAFILES', COUNT(*)
FROM dba_data_files WHERE tablespace_name = 'TARGET_TS'
UNION ALL
SELECT 'USERS_DEFAULT', COUNT(*)
FROM dba_users WHERE default_tablespace = 'TARGET_TS'
UNION ALL
SELECT 'USERS_TEMP', COUNT(*)
FROM dba_users WHERE temporary_tablespace = 'TARGET_TS';

2. 변경 관리 프로세스(Change Management)를 통한 검토 의무화

운영 환경에서 테이블스페이스 삭제와 같은 DDL 작업은 반드시 변경 관리 프로세스를 거쳐 DBA 리뷰와 승인을 받도록 절차를 마련해야 합니다. 특히 다수의 스키마가 공유하는 테이블스페이스를 삭제할 경우, 연관된 애플리케이션 팀의 확인을 받고 CASCADE CONSTRAINTS 옵션 사용 여부까지 사전에 협의하는 것이 중요합니다. 작업 전 전체 백업(RMAN 등)을 수행하고, 작업 이력을 남기는 것도 필수입니다.


관련 에러

  • ORA-01548: active rollback segment found, terminate dropping tablespace — 활성 롤백 세그먼트가 존재하는 테이블스페이스를 삭제하려 할 때 발생합니다.
  • ORA-01562: failed to extend rollback segment — 언두 테이블스페이스 관련 작업 중 공간 부족 시 발생합니다.
  • ORA-00959: tablespace 'string' does not exist — 존재하지 않는 테이블스페이스를 참조하려 할 때 발생합니다.
  • ORA-01647: tablespace 'string' is read only, cannot allocate space in it — 읽기 전용 테이블스페이스에 쓰기를 시도할 때 발생합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기