2026년 07월 23일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01550 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01550 cannot drop system tablespace 는?
ORA-01550 에러는 Oracle 데이터베이스에서 SYSTEM 테이블스페이스를 삭제(DROP)하려 할 때 발생하는 에러입니다. SYSTEM 테이블스페이스는 Oracle 데이터베이스의 핵심 구성 요소로, 데이터 딕셔너리, 시스템 카탈로그, PL/SQL 패키지 등 데이터베이스 운영에 필수적인 정보를 담고 있기 때문에 절대로 삭제할 수 없습니다. 이 에러는 주로 DBA가 실수로 DROP TABLESPACE 명령을 SYSTEM 테이블스페이스에 실행하거나, 스크립트 자동화 과정에서 잘못된 대상 테이블스페이스가 지정될 때 발생합니다.
주요 발생 원인
- 실수 또는 오타로 인한 SYSTEM 테이블스페이스 직접 삭제 시도
가장 흔한 원인은 DBA가 다른 테이블스페이스를 삭제하려다 실수로 SYSTEM을 대상으로 DROP TABLESPACE 명령을 실행하는 경우입니다. 특히 다수의 테이블스페이스를 관리하는 대형 환경에서 스크립트를 일괄 실행할 때 변수나 파라미터가 잘못 설정되어 SYSTEM 테이블스페이스가 대상이 되는 사고가 발생하기 쉽습니다.
- 자동화 스크립트 또는 유지보수 배치 작업의 오류
DBA가 작성한 자동화 배치 스크립트나 데이터베이스 유지보수 작업에서 테이블스페이스 목록을 동적으로 생성하다가 잘못된 필터 조건으로 인해 SYSTEM 테이블스페이스가 삭제 대상 목록에 포함되는 경우입니다. 이런 경우 스크립트 내 예외 처리나 사전 검증 로직이 없으면 실제 DROP 명령이 실행되어 에러가 발생합니다.
- 미숙한 DBA 또는 권한 남용으로 인한 잘못된 명령 실행
경험이 부족한 DBA 또는 과도한 권한(DBA Role)을 가진 사용자가 테이블스페이스 구조를 충분히 이해하지 못한 채로 DROP TABLESPACE 명령을 실행하는 경우입니다. Oracle은 내부적으로 이 명령을 차단하지만, 이 에러를 마주친다는 것 자체가 해당 사용자의 권한 관리 및 교육이 필요하다는 신호입니다.
해결 방법
ORA-01550은 Oracle이 의도적으로 차단하는 에러이므로, 해결 방법은 “SYSTEM 테이블스페이스를 절대 삭제하지 않는 것”입니다. 대신 아래와 같은 접근으로 문제를 해결하고 안전하게 관리할 수 있습니다.
1. 현재 테이블스페이스 목록 확인 후 올바른 대상 선택
우선 어떤 테이블스페이스가 존재하는지 확인하고, 삭제하려는 테이블스페이스가 정확한지 검증합니다.
-- 전체 테이블스페이스 목록 및 상태 조회
SELECT tablespace_name,
status,
contents,
logging
FROM dba_tablespaces
ORDER BY tablespace_name;
-- SYSTEM 테이블스페이스가 아닌 특정 테이블스페이스 확인
SELECT tablespace_name,
bytes / 1024 / 1024 AS size_mb,
status
FROM dba_data_files
WHERE tablespace_name NOT IN ('SYSTEM', 'SYSAUX', 'UNDOTBS1', 'TEMP')
ORDER BY tablespace_name;
2. 삭제 대상 테이블스페이스가 올바른 경우 안전하게 DROP
SYSTEM이 아닌, 실제로 삭제하려는 테이블스페이스가 맞다면 다음 절차로 진행합니다.
-- 삭제 전 해당 테이블스페이스 내 오브젝트 확인
SELECT owner,
segment_name,
segment_type,
bytes / 1024 / 1024 AS size_mb
FROM dba_segments
WHERE tablespace_name = '삭제할_테이블스페이스명'
ORDER BY bytes DESC;
-- 테이블스페이스를 오프라인으로 변경 후 삭제
ALTER TABLESPACE 삭제할_테이블스페이스명 OFFLINE;
-- 데이터 파일까지 포함하여 테이블스페이스 삭제
DROP TABLESPACE 삭제할_테이블스페이스명
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
3. 자동화 스크립트에 SYSTEM 테이블스페이스 제외 로직 추가
스크립트가 원인인 경우, 반드시 보호 대상 테이블스페이스를 필터링하는 로직을 추가합니다.
-- 동적으로 삭제 대상 테이블스페이스 목록 생성 시 SYSTEM 계열 제외
SELECT 'DROP TABLESPACE ' || tablespace_name ||
' INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;' AS drop_sql
FROM dba_tablespaces
WHERE tablespace_name NOT IN (
'SYSTEM',
'SYSAUX',
'UNDOTBS1',
'TEMP',
'USERS' -- 필요에 따라 보호할 테이블스페이스 추가
)
AND status = 'ONLINE'
AND contents = 'PERMANENT';
-- 삭제 전 반드시 위 결과를 검토 후 실행할 것
4. SYSTEM 테이블스페이스 상태 및 사용 현황 점검
혹시 SYSTEM 테이블스페이스가 과도하게 사용되어 삭제를 고려했다면, 공간 정리를 통해 해결합니다.
-- SYSTEM 테이블스페이스 사용량 확인
SELECT df.tablespace_name,
df.bytes / 1024 / 1024 AS total_mb,
(df.bytes - fs.free_bytes) / 1024 / 1024 AS used_mb,
fs.free_bytes / 1024 / 1024 AS free_mb,
ROUND((df.bytes - fs.free_bytes) / df.bytes * 100, 2) AS used_pct
FROM (
SELECT tablespace_name, SUM(bytes) AS bytes
FROM dba_data_files
WHERE tablespace_name = 'SYSTEM'
GROUP BY tablespace_name
) df,
(
SELECT tablespace_name, SUM(bytes) AS free_bytes
FROM dba_free_space
WHERE tablespace_name = 'SYSTEM'
GROUP BY tablespace_name
) fs
WHERE df.tablespace_name = fs.tablespace_name;
-- SYSTEM 테이블스페이스 내 불필요한 오브젝트 확인
SELECT owner,
object_type,
COUNT(*) AS object_count
FROM dba_objects
WHERE tablespace_name = 'SYSTEM'
AND owner NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'DBSNMP')
GROUP BY owner, object_type
ORDER BY object_count DESC;
예방 방법
- DROP TABLESPACE 명령 실행 전 이중 검증 절차 의무화
모든 DROP TABLESPACE 명령 실행 전에 반드시 대상 테이블스페이스 이름을 확인하고, SYSTEM, SYSAUX, UNDOTBS1, TEMP 등 핵심 테이블스페이스가 포함되지 않았는지 이중으로 검증하는 체크리스트를 만들어 운영 표준으로 채택하세요. 자동화 스크립트에는 반드시 보호 대상 테이블스페이스를 하드코딩된 예외 목록으로 처리하고, 운영 환경에서는 변경 관리(Change Management) 프로세스를 통해 DBA 작업을 승인 후 실행하는 문화를 정착시켜야 합니다.
- 최소 권한 원칙 적용 및 감사(Audit) 활성화
일반 DBA에게는 DROP TABLESPACE 권한을 직접 부여하지 말고, 필요한 경우에만 한시적으로 권한을 부여하는 방식을 채택하세요. Oracle Audit 기능을 활성화하여 DROP TABLESPACE 명령의 실행 이력을 모두 기록하고, 비정상적인 DDL 작업이 발생할 경우 즉시 알림을 받을 수 있도록 구성하면 사고를 사전에 예방할 수 있습니다.
-- DROP TABLESPACE 명령에 대한 감사 설정
AUDIT DROP TABLESPACE BY ACCESS;
-- 감사 로그 확인
SELECT os_username,
username,
action_name,
obj_name,
timestamp,
returncode
FROM dba_audit_trail
WHERE action_name = 'DROP TABLESPACE'
ORDER BY timestamp DESC;
관련 에러
- ORA-01549: 테이블스페이스가 비어있지 않아 삭제할 수 없을 때 발생합니다.
INCLUDING CONTENTS옵션으로 해결할 수 있습니다. - ORA-01551: SYSTEM 테이블스페이스를 오프라인 상태로 전환하려 할 때 발생하는 에러로, ORA-01550과 유사한 맥락입니다.
- ORA-00959: 존재하지 않는 테이블스페이스를 참조할 때 발생하며, 스크립트 오류 디버깅 시 함께 마주칠 수 있습니다.
- ORA-01543: 이미 존재하는 테이블스페이스를 생성하려 할 때 발생하며, 테이블스페이스 재생성 작업 시 관련될 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.