2026년 07월 06일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01118 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01118 cannot add any more database files: limit exceeded 는?
ORA-01118 에러는 Oracle 데이터베이스에 더 이상 데이터파일을 추가할 수 없을 때 발생하는 에러입니다. 이는 데이터베이스 생성 시 설정된 DB_FILES 파라미터 또는 Oracle 내부적으로 허용하는 최대 데이터파일 수에 도달했을 때 발생합니다. 주로 테이블스페이스에 새로운 데이터파일을 추가하거나 CREATE TABLESPACE 명령을 실행할 때 이 에러를 마주치게 됩니다.
주요 발생 원인
- DB_FILES 파라미터 한계 초과
Oracle 인스턴스는 DB_FILES 초기화 파라미터를 통해 데이터베이스가 동시에 열 수 있는 최대 데이터파일 수를 제한합니다. 기본값은 버전마다 다르지만 일반적으로 200개 수준이며, 대규모 데이터베이스 환경에서는 이 한계에 도달하는 경우가 빈번합니다. 시스템이 성장함에 따라 테이블스페이스와 데이터파일이 지속적으로 추가되면서 이 한계를 초과하게 됩니다.
- MAXDATAFILES 설정 한계 초과 (Control File 레벨)
데이터베이스 생성 시 CREATE DATABASE 문의 MAXDATAFILES 옵션으로 지정된 컨트롤 파일 내 최대 데이터파일 항목 수를 초과하는 경우입니다. 이 값은 컨트롤 파일에 물리적으로 기록되며, DB_FILES 파라미터와는 별개로 관리됩니다. 컨트롤 파일을 재생성하지 않으면 이 한계를 늘릴 수 없어 더욱 까다로운 상황을 야기합니다.
- 불필요한 데이터파일의 누적 및 관리 미흡
장기간 운영되는 데이터베이스 환경에서 삭제되지 않은 임시 테이블스페이스 파일, 테스트용 데이터파일, 혹은 마이그레이션 과정에서 남겨진 파일들이 누적되어 한계에 도달하는 경우입니다. 실제로 사용 중이지 않은 데이터파일들이 V$DATAFILE에 등록된 상태로 슬롯을 차지하고 있어 유효한 데이터파일 추가를 막게 됩니다.
해결 방법
1. 현재 데이터파일 수 및 한계 확인
먼저 현재 상황을 정확히 파악하는 것이 최우선입니다.
-- 현재 등록된 데이터파일 총 수 확인
SELECT COUNT(*) AS current_datafile_count
FROM V$DATAFILE;
-- DB_FILES 파라미터 현재 값 확인
SHOW PARAMETER DB_FILES;
-- 또는
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME = 'db_files';
-- 컨트롤 파일의 MAXDATAFILES 설정 확인
SELECT CF_MAX_FILES AS maxdatafiles_in_controlfile
FROM V$DATABASE;
-- 데이터파일 목록 및 상태 확인
SELECT FILE#, STATUS, NAME, BYTES/1024/1024 AS SIZE_MB
FROM V$DATAFILE
ORDER BY FILE#;
2. DB_FILES 파라미터 값 증가 (가장 빠른 해결책)
DB_FILES는 동적 파라미터가 아니므로 변경 후 데이터베이스 재시작이 필요합니다.
-- DB_FILES 값을 500으로 늘리기 (SPFILE 사용 환경)
ALTER SYSTEM SET DB_FILES = 500 SCOPE = SPFILE;
-- 변경 후 데이터베이스 재시작
SHUTDOWN IMMEDIATE;
STARTUP;
-- 변경 내용 확인
SHOW PARAMETER DB_FILES;
> ⚠️ 주의: DB_FILES 값은 줄일 수 없으며, 현재 데이터파일 수보다 작게 설정하면 데이터베이스가 기동되지 않습니다.
3. 컨트롤 파일 재생성 (MAXDATAFILES 한계 초과 시)
컨트롤 파일 레벨의 MAXDATAFILES 한계에 도달했다면 컨트롤 파일을 재생성해야 합니다.
-- 컨트롤 파일 재생성 스크립트 자동 생성
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/recreate_cf.sql' REUSE NORESETLOGS;
-- 생성된 스크립트를 열어 MAXDATAFILES 값을 수정 후 실행
-- 예시 (스크립트 내 수정 부분):
-- MAXDATAFILES 1024 -- 기존 값에서 충분히 큰 값으로 변경
-- 마운트 상태에서 컨트롤 파일 재생성 (스크립트 내용 기반)
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 1024 -- 이 값을 충분히 크게 설정
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/ORCL/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/u01/oradata/ORCL/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/oradata/ORCL/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/oradata/ORCL/system01.dbf',
'/u01/oradata/ORCL/sysaux01.dbf',
'/u01/oradata/ORCL/undotbs01.dbf',
'/u01/oradata/ORCL/users01.dbf'
CHARACTER SET AL32UTF8;
> ⚠️ 경고: 컨트롤 파일 재생성은 고위험 작업입니다. 반드시 사전에 전체 백업을 수행하고, RAC 환경이나 Data Guard 환경에서는 추가적인 고려가 필요합니다.
4. 불필요한 데이터파일 정리
실제로 사용되지 않는 데이터파일이 있다면 정리하여 슬롯을 확보합니다.
-- OFFLINE DROP 상태의 데이터파일 확인
SELECT FILE#, STATUS, NAME
FROM V$DATAFILE
WHERE STATUS = 'OFFLINE';
-- 사용하지 않는 테이블스페이스 및 데이터파일 삭제
-- (해당 테이블스페이스가 완전히 불필요한 경우)
DROP TABLESPACE old_test_ts INCLUDING CONTENTS AND DATAFILES;
-- 특정 데이터파일만 오프라인 후 제거 (주의 필요)
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/old_data01.dbf' OFFLINE DROP;
-- 데이터파일 삭제 후 현재 카운트 재확인
SELECT COUNT(*) AS remaining_datafile_count
FROM V$DATAFILE;
5. AUTOEXTEND 활성화로 데이터파일 추가 최소화
새 데이터파일 추가 대신 기존 파일의 자동 확장을 활성화하여 파일 수 증가를 억제합니다.
-- 기존 데이터파일에 AUTOEXTEND 활성화
ALTER DATABASE DATAFILE '/u01/oradata/ORCL/users01.dbf'
AUTOEXTEND ON NEXT 512M MAXSIZE 32767M;
-- 테이블스페이스 내 모든 데이터파일의 AUTOEXTEND 상태 확인
SELECT FILE_NAME,
AUTOEXTENSIBLE,
BYTES/1024/1024 AS CURRENT_SIZE_MB,
MAXBYTES/1024/1024 AS MAX_SIZE_MB
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'USERS'
ORDER BY FILE_NAME;
예방 방법
- 초기 데이터베이스 설계 시 충분한 여유값 설정
데이터베이스를 생성할 때부터 MAXDATAFILES와 DB_FILES 값을 예상 성장치의 최소 2~3배 이상으로 넉넉하게 설정하는 것이 중요합니다. 또한 정기적인 모니터링 스크립트를 통해 현재 데이터파일 수가 한계치의 80%에 도달하면 자동 알림이 발생하도록 설정해 두어야 합니다.
“`sql
— 데이터파일 사용률 모니터링 쿼리 (80% 경고 기준)
SELECT CURRENT_COUNT,
MAX_FILES,
ROUND(CURRENT_COUNT / MAX_FILES * 100, 2) AS USAGE_PCT,
CASE WHEN CURRENT_COUNT / MAX_FILES >= 0.8
THEN ‘⚠️ WARNING: 80% 초과’
ELSE ‘✅ NORMAL’
END AS STATUS
FROM (
SELECT COUNT(*) AS CURRENT_COUNT,
(SELECT TO_NUMBER(VALUE) FROM V$PARAMETER WHERE NAME = ‘db_files’) AS MAX_FILES
FROM V$DATAFILE
);
“`
- AUTOEXTEND 및 BigFile 테이블스페이스 적극 활용
가능한 경우 BigFile 테이블스페이스를 사용하면 하나의 테이블스페이스가 단 하나의 데이터파일을 사용하므로 데이터파일 수 증가 문제를 근본적으로 줄일 수 있습니다. SmallFile 테이블스페이스를 사용하더라도 AUTOEXTEND ON을 기본으로 설정하고 최대 크기를 적절히 지정하여 불필요한 데이터파일 추가를 최소화해야 합니다.
“`sql
— BigFile 테이블스페이스 생성 예시 (파일 수 절약)
CREATE BIGFILE TABLESPACE big_data_ts
DATAFILE ‘/u01/oradata/ORCL/big_data01.dbf’
SIZE 10G
AUTOEXTEND ON NEXT 1G MAXSIZE UNLIMITED;
“`
관련 에러
- ORA-01119:
error in creating database file— 데이터파일 생성 자체에 실패할 때 발생하며, ORA-01118과 함께 연속으로 나타날 수 있습니다. - ORA-00059:
maximum number of DB_FILES exceeded—DB_FILES파라미터 한계와 직접 연관된 에러로, ORA-01118과 유사한 상황에서 발생합니다. - ORA-01565:
error in identifying file— 데이터파일 경로 문제와 함께 발생하는 에러로, 파일 추가 실패 시 연관되어 나타날 수 있습니다. - ORA-02236:
invalid file name— 잘못된 파일명으로 데이터파일을 추가하려 할 때 발생하며, ORA-01118 이전 단계에서 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.