[Oracle] ORA-0165x: 테이블스페이스 공간 부족 해결하기(ORA-01653, ORA-01654)

ORA-01653, ORA-01654 등으로 대표되는 이 오류 그룹은 “테이블스페이스(Tablespace)에 더 이상 할당할 공간이 없습니다” 라는 명확한 의미를 가집니다. 대용량 데이터를 INSERT 하거나, 대규모 업데이트, 인덱스 생성 등의 작업을 할 때 테이블이나 인덱스가 필요로 하는 추가 공간을 확보하지 못하면 발생합니다.

이는 서비스 장애로 직결될 수 있는 중요한 문제이지만, 원인과 해결 방법이 명확하여 DBA라면 반드시 능숙하게 처리할 수 있어야 합니다.


## 핵심 개념: 테이블스페이스와 데이터 파일

이 오류를 이해하려면 두 가지 물리적 구조를 알아야 합니다.

  • 테이블스페이스(Tablespace): 테이블, 인덱스 등 관련 있는 데이터 객체들을 그룹화하여 저장하는 논리적인 저장 단위입니다. (예: 사용자 데이터용 USERS_TS, 인덱스용 INDEX_TS)
  • 데이터 파일(Datafile): 테이블스페이스에 저장되는 데이터가 실제로 기록되는 물리적인 운영체제 파일(.dbf)입니다. 하나의 테이블스페이스는 하나 이상의 데이터 파일로 구성될 수 있습니다.

ORA-0165x 오류는 특정 테이블스페이스에 속한 모든 데이터 파일들의 물리적인 공간이 꽉 차서 더 이상 데이터를 기록할 수 없을 때 발생합니다.


## 1단계: 공간 부족 현황 파악하기

오류가 발생하면, 가장 먼저 어느 테이블스페이스의 공간이 얼마나 부족한지 정확히 확인해야 합니다.

  • 테이블스페이스 사용량 확인 쿼리:이 쿼리를 실행하면 각 테이블스페이스의 전체 크기, 사용 중인 크기, 남은 크기, 사용률(%)을 한눈에 볼 수 있습니다. USED_PERCENT가 95% 이상인 테이블스페이스가 문제의 원인일 확률이 높습니다.
SELECT
    F.TABLESPACE_NAME,
    ROUND(F.TOTAL_MB, 2) AS TOTAL_MB,
    ROUND(F.TOTAL_MB - F.FREE_MB, 2) AS USED_MB,
    ROUND(F.FREE_MB, 2) AS FREE_MB,
    ROUND((F.TOTAL_MB - F.FREE_MB) / F.TOTAL_MB * 100, 2) || '%' AS USED_PERCENT
FROM (
    SELECT
        TABLESPACE_NAME,
        SUM(BYTES) / 1024 / 1024 AS TOTAL_MB,
        (SELECT SUM(BYTES) / 1024 / 1024
         FROM DBA_FREE_SPACE
         WHERE TABLESPACE_NAME = A.TABLESPACE_NAME) AS FREE_MB
    FROM
        DBA_DATA_FILES A
    GROUP BY
        TABLESPACE_NAME
) F
ORDER BY
    USED_PERCENT DESC;

## 2단계: 공간 확보를 위한 해결 방안

공간을 확보하는 방법은 크게 두 가지입니다. 기존 데이터 파일의 크기를 늘리거나, 새로운 데이터 파일을 추가하는 것입니다.

해결 방안 1: 데이터 파일 크기 변경 (RESIZE)

기존 데이터 파일의 크기를 더 크게 변경하여 공간을 확보합니다. 디스크에 여유 공간이 충분할 때 사용할 수 있는 간편한 방법입니다.

  • 해당 테이블스페이스의 데이터 파일 확인
SELECT FILE_NAME, BYTES / 1024 / 1024 AS MB
  FROM DBA_DATA_FILES
 WHERE TABLESPACE_NAME = 'USERS_TS'; -- 문제의 테이블스페이스 이름
  • 데이터 파일 크기 변경 실행
-- '/path/to/datafile/users01.dbf' 파일의 크기를 2GB로 늘림 
ALTER DATABASE DATAFILE '/path/to/datafile/users01.dbf' RESIZE 2G;

해결 방안 2: 새로운 데이터 파일 추가 (ADD DATAFILE)

기존 파일은 그대로 두고, 테이블스페이스에 새로운 데이터 파일을 추가하여 전체 공간을 늘립니다. 파일 시스템의 최대 파일 크기 제한이 있거나, 디스크 공간을 분산하고 싶을 때 유용합니다.

  • 데이터 파일 추가 실행
-- 'USERS_TS' 테이블스페이스에 1GB 크기의 새 데이터 파일 'users02.dbf'를 추가
ALTER TABLESPACE USERS_TS
ADD DATAFILE '/path/to/new_datafile/users02.dbf' SIZE 1G;

## 예방 조치: AUTOEXTEND 옵션

매번 수동으로 공간을 늘리는 것이 번거롭다면, 데이터 파일에 AUTOEXTEND 옵션을 설정할 수 있습니다. 이 옵션은 공간이 부족해질 때마다 Oracle이 자동으로 파일 크기를 지정된 만큼 늘려주는 기능입니다.

  • AUTOEXTEND 설정
-- 'users01.dbf' 파일이 공간 부족 시 100MB씩 자동으로 증가하도록 설정 (최대 10GB까지)
ALTER DATABASE DATAFILE '/path/to/datafile/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 10G;
  • 주의사항: AUTOEXTEND는 편리하지만, 디스크 공간을 예기치 않게 모두 소진하여 더 큰 장애를 유발할 수 있습니다. 따라서 MAXSIZE를 적절히 설정하고, 주기적으로 디스크 전체의 여유 공간을 모니터링하는 것이 매우 중요합니다.

ORA-0165x 오류는 DBA의 주기적인 모니터링과 용량 계획을 통해 충분히 예방할 수 있는 문제입니다. 문제가 발생했을 때는 당황하지 말고, 사용량을 확인하고 적절한 해결책을 적용하면 됩니다.