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

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

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

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

댓글 남기기