2026년 06월 22일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00959 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00959 tablespace does not exist 는?
ORA-00959 에러는 Oracle 데이터베이스에서 사용자가 참조하거나 지정한 테이블스페이스가 실제로 데이터베이스에 존재하지 않을 때 발생하는 에러입니다. 주로 테이블, 인덱스, 사용자 생성 또는 변경 시 TABLESPACE 절에 잘못된 이름을 입력하거나, 해당 테이블스페이스가 삭제된 경우에 나타납니다. 운영 환경과 개발 환경 간의 테이블스페이스 구성 차이, 혹은 타 DB에서 스크립트를 그대로 가져와 실행할 때 빈번하게 발생하는 현장 에러입니다.
주요 발생 원인
- 존재하지 않는 테이블스페이스 이름 직접 지정
가장 흔한 원인으로, DDL 스크립트에서 TABLESPACE 절에 오타가 있거나, 실제 데이터베이스에 생성되지 않은 테이블스페이스 이름을 하드코딩한 경우입니다. 예를 들어 개발 서버에는 APP_DATA라는 테이블스페이스가 존재하지만, 운영 서버에는 APPDATA로 생성되어 있는 경우 스크립트를 그대로 이관하면 이 에러가 발생합니다. 프로젝트 초기나 DB 마이그레이션 시 가장 자주 겪는 상황입니다.
- 테이블스페이스가 이미 삭제(DROP)된 경우
운영 중에 불필요한 테이블스페이스를 정리하는 과정에서 DROP TABLESPACE 명령을 실행한 후, 해당 테이블스페이스를 아직 참조하는 객체나 사용자의 기본 테이블스페이스(DEFAULT TABLESPACE)가 남아 있을 때 발생합니다. 특히 사용자의 DEFAULT TABLESPACE 또는 TEMPORARY TABLESPACE로 설정된 테이블스페이스가 삭제되면, 이후 해당 사용자가 객체를 생성하려 할 때 ORA-00959가 발생합니다. DBA가 테이블스페이스 정리 시 의존성 확인을 소홀히 할 경우 빈번하게 나타납니다.
- 타 데이터베이스 환경에서 Export/Import 또는 스크립트 이관
Data Pump(impdp) 또는 exp/imp를 이용한 데이터 이관 시, 원본 DB에 존재하던 테이블스페이스가 대상 DB에는 없는 경우 임포트 과정에서 이 에러가 발생합니다. 개발, 스테이징, 운영 환경별로 테이블스페이스 구성이 다를 때, 스크립트를 환경에 맞게 수정하지 않고 그대로 실행하면 동일한 문제가 발생합니다. CI/CD 파이프라인에서 DB 배포 자동화를 구성할 때 반드시 체크해야 할 포인트입니다.
해결 방법
1단계: 현재 데이터베이스에 존재하는 테이블스페이스 확인
먼저 데이터베이스에 실제로 어떤 테이블스페이스가 있는지 확인합니다.
-- 전체 테이블스페이스 목록 조회
SELECT tablespace_name, status, contents
FROM dba_tablespaces
ORDER BY tablespace_name;
-- 특정 이름 패턴으로 확인 (오타 검증 시 유용)
SELECT tablespace_name
FROM dba_tablespaces
WHERE tablespace_name LIKE '%APP%';
2단계: 누락된 테이블스페이스 생성
참조한 테이블스페이스가 실제로 존재하지 않는다면 생성해 주어야 합니다.
-- 일반 영구 테이블스페이스 생성
CREATE TABLESPACE app_data
DATAFILE '/oradata/ORCL/app_data01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
-- 임시 테이블스페이스 생성
CREATE TEMPORARY TABLESPACE app_temp
TEMPFILE '/oradata/ORCL/app_temp01.dbf' SIZE 200M
AUTOEXTEND ON NEXT 50M MAXSIZE 5G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
3단계: 사용자의 기본 테이블스페이스 수정
사용자의 DEFAULT TABLESPACE가 존재하지 않는 경우, 변경해줍니다.
-- 사용자 기본 테이블스페이스 확인
SELECT username, default_tablespace, temporary_tablespace
FROM dba_users
WHERE username = 'APP_USER';
-- 기본 테이블스페이스 변경
ALTER USER app_user DEFAULT TABLESPACE app_data;
-- 임시 테이블스페이스 변경
ALTER USER app_user TEMPORARY TABLESPACE app_temp;
4단계: DDL 스크립트의 TABLESPACE 절 수정
기존 스크립트에서 잘못된 테이블스페이스 이름을 수정합니다.
-- 잘못된 예 (존재하지 않는 테이블스페이스 지정)
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
order_date DATE,
amount NUMBER
) TABLESPACE OLD_DATA; -- 존재하지 않음
-- 수정된 예
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
order_date DATE,
amount NUMBER
) TABLESPACE app_data; -- 실제 존재하는 테이블스페이스
-- 기존 테이블의 테이블스페이스 이동 (필요 시)
ALTER TABLE orders MOVE TABLESPACE app_data;
-- 인덱스 재구성 (MOVE 후 필수)
ALTER INDEX pk_orders REBUILD TABLESPACE app_data;
5단계: Data Pump Import 시 테이블스페이스 매핑
impdp 사용 시 원본과 대상의 테이블스페이스 이름이 다를 경우 REMAP_TABLESPACE 파라미터를 활용합니다.
-- impdp 실행 시 테이블스페이스 매핑 옵션 사용 예시
-- (커맨드라인 명령어, SQL*Plus 외부에서 실행)
-- impdp system/password DIRECTORY=dp_dir DUMPFILE=export.dmp
-- REMAP_TABLESPACE=old_tablespace:app_data
-- LOGFILE=import.log
-- 또는 parfile 사용
-- REMAP_TABLESPACE=OLD_DATA:APP_DATA,OLD_IDX:APP_IDX
-- 임포트 전 대상 DB 테이블스페이스 사전 확인 쿼리
SELECT tablespace_name FROM dba_tablespaces
MINUS
SELECT tablespace_name FROM dba_tablespaces@source_db_link;
예방 방법
- 배포 스크립트에 테이블스페이스 존재 여부 사전 검증 로직 추가
DDL 스크립트 실행 전, 해당 스크립트에서 사용하는 테이블스페이스가 대상 DB에 실제로 존재하는지 검증하는 절차를 표준화합니다. 아래와 같이 PL/SQL 블록을 배포 스크립트 앞에 추가하면 사전에 오류를 방지할 수 있습니다.
“`sql
— 배포 전 테이블스페이스 존재 여부 검증 스크립트
DECLARE
v_count NUMBER;
v_ts_name VARCHAR2(30) := ‘APP_DATA’; — 검증할 테이블스페이스
BEGIN
SELECT COUNT(*)
INTO v_count
FROM dba_tablespaces
WHERE tablespace_name = v_ts_name;
IF v_count = 0 THEN
RAISE_APPLICATION_ERROR(-20001,
‘ERROR: Tablespace [‘ || v_ts_name || ‘] does not exist. ‘
|| ‘Please create it before running this script.’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘OK: Tablespace [‘ || v_ts_name || ‘] exists.’);
END IF;
END;
/
“`
- 환경별 테이블스페이스 구성 문서화 및 표준화
개발, QA, 스테이징, 운영 환경 간 테이블스페이스 이름과 구성을 동일하게 유지하거나, 환경별 차이를 명확히 문서화하여 팀 전체가 공유합니다. 특히 신규 환경 구축 시 테이블스페이스 생성 스크립트를 형상 관리 도구(Git 등)에 반드시 포함시켜 일관성을 유지하는 것이 중요합니다. 또한 테이블스페이스 삭제 전에는 반드시 의존 객체 및 사용자 설정을 확인하는 프로세스를 팀 운영 정책으로 수립해야 합니다.
“`sql
— 테이블스페이스 삭제 전 의존성 확인 쿼리
— 해당 테이블스페이스를 사용하는 세그먼트 확인
SELECT owner, segment_name, segment_type
FROM dba_segments
WHERE tablespace_name = ‘APP_DATA’
ORDER BY owner, segment_type, segment_name;
— 해당 테이블스페이스를 기본으로 사용하는 사용자 확인
SELECT username, default_tablespace, temporary_tablespace
FROM dba_users
WHERE default_tablespace = ‘APP_DATA’
OR temporary_tablespace = ‘APP_DATA’;
“`
관련 에러
- ORA-00960:
ambiguous column naming in select list— 테이블스페이스보다는 쿼리 관련 에러이지만, DDL 작성 실수와 함께 발생하기도 합니다. - ORA-01543:
tablespace already exists— ORA-00959와 반대로, 이미 존재하는 테이블스페이스를 다시 생성하려 할 때 발생합니다. - ORA-01119:
error in creating database file— 테이블스페이스 생성 시 데이터파일 경로가 잘못되었을 때 발생하며, ORA-00959 해결을 위해 테이블스페이스를 새로 만들 때 함께 마주칠 수 있습니다. - ORA-00942:
table or view does not exist— 테이블스페이스가 아닌 테이블 자체가 없을 때 발생하는 에러로, 유사한 맥락에서 자주 혼동됩니다. - ORA-01652:
unable to extend temp segment by N in tablespace— 임시 테이블스페이스 용량 부족 에러로, 테이블스페이스 관리 실수와 연관되어 함께 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.