ORA-00200 control file could not be created 는?
ORA-00200 에러는 Oracle 데이터베이스가 컨트롤 파일(Control File)을 생성하려는 시도를 했으나 실패했을 때 발생하는 에러입니다. 컨트롤 파일은 데이터베이스의 물리적 구조 정보(데이터파일 위치, 리두 로그 파일 위치, 데이터베이스 이름, SCN 등)를 담고 있는 핵심 파일로, 이 파일 없이는 데이터베이스를 정상적으로 기동할 수 없습니다. 주로 CREATE DATABASE 명령 실행 시, CREATE CONTROLFILE 명령 수행 시, 또는 RMAN을 통한 복구 작업 중에 이 에러가 발생하며, 빠른 원인 분석과 조치가 필요합니다.
주요 발생 원인
1. 파일 시스템 권한 부족 또는 디렉토리 미존재
가장 흔한 원인으로, Oracle 프로세스(oracle 또는 grid 계정)가 컨트롤 파일을 생성하려는 대상 디렉토리에 대한 쓰기 권한이 없거나, 해당 디렉토리 자체가 존재하지 않는 경우입니다. 특히 신규 서버 세팅이나 스토리지 마운트 포인트 변경 후 디렉토리 구조를 재생성하지 않았을 때 자주 발생합니다. OS 레벨에서 ls -la 명령으로 디렉토리 소유자와 퍼미션을 반드시 확인해야 합니다.
2. 디스크 공간 부족 (Disk Full)
컨트롤 파일이 저장될 파일시스템의 여유 공간이 부족하거나 OS 레벨의 파일 사이즈 제한(ulimit)에 걸린 경우입니다. 운영 환경에서 아카이브 로그나 트레이스 파일이 특정 파티션을 가득 채웠을 때 이 에러가 연쇄적으로 발생할 수 있습니다. df -h 명령으로 파일시스템 사용률을 즉시 점검해야 합니다.
3. INIT.ORA 또는 SPFILE의 CONTROL_FILES 파라미터 설정 오류
CONTROL_FILES 파라미터에 지정된 경로가 잘못되었거나, 이전에 사용하던 컨트롤 파일이 이미 존재하지 않는 경로를 참조하고 있을 때 발생합니다. 데이터베이스를 다른 서버로 마이그레이션하거나 디렉토리 구조를 변경한 이후에 파라미터 파일을 업데이트하지 않으면 이 문제가 발생합니다. SPFILE과 PFILE의 파라미터가 서로 다르게 설정된 경우도 혼란의 원인이 됩니다.
해결 방법
원인 1 해결: 디렉토리 생성 및 권한 부여
OS 레벨에서 컨트롤 파일이 저장될 디렉토리를 생성하고 oracle 계정에 적절한 권한을 부여합니다.
# OS 레벨 (root 계정으로 수행)
mkdir -p /u01/app/oracle/oradata/ORCL
chown oracle:oinstall /u01/app/oracle/oradata/ORCL
chmod 755 /u01/app/oracle/oradata/ORCL
# 권한 확인
ls -la /u01/app/oracle/oradata/
디렉토리 생성 후 컨트롤 파일을 수동으로 재생성합니다.
-- NOMOUNT 상태에서 컨트롤 파일 생성 예시
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ORCL/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORCL/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORCL/redo03.log' SIZE 50M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/ORCL/system01.dbf',
'/u01/app/oracle/oradata/ORCL/sysaux01.dbf',
'/u01/app/oracle/oradata/ORCL/undotbs01.dbf',
'/u01/app/oracle/oradata/ORCL/users01.dbf'
CHARACTER SET AL32UTF8;
-- 컨트롤 파일 생성 확인
SELECT NAME, STATUS FROM V$CONTROLFILE;
원인 2 해결: 디스크 공간 확보
# 디스크 사용량 확인 (OS 레벨)
df -h
du -sh /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/*
# 오래된 트레이스 파일 정리 (30일 이상)
find /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ -name "*.trc" -mtime +30 -exec rm -f {} \;
find /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ -name "*.trm" -mtime +30 -exec rm -f {} \;
공간 확보 후 아카이브 로그 정리는 RMAN을 통해 안전하게 수행합니다.
-- RMAN을 통한 아카이브 로그 정리
-- (rman 접속 후 수행)
RMAN> CONNECT TARGET /
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
-- 삭제 전 반드시 백업 확인
RMAN> LIST ARCHIVELOG ALL;
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
ulimit 설정도 확인합니다.
# oracle 계정의 파일 사이즈 제한 확인
su - oracle
ulimit -a | grep -E "file size|open files"
# /etc/security/limits.conf 에서 설정 조정 (root 권한 필요)
# oracle soft fsize unlimited
# oracle hard fsize unlimited
원인 3 해결: CONTROL_FILES 파라미터 수정
현재 설정된 CONTROL_FILES 파라미터를 확인하고 올바른 경로로 수정합니다.
-- 현재 CONTROL_FILES 파라미터 확인
SHOW PARAMETER CONTROL_FILES;
-- V$PARAMETER 뷰로도 확인 가능
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME = 'control_files';
-- SPFILE 사용 중인 경우 파라미터 변경
-- (반드시 NOMOUNT 또는 MOUNT 상태에서 수행)
ALTER SYSTEM SET CONTROL_FILES =
'/u01/app/oracle/oradata/ORCL/control01.ctl',
'/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl'
SCOPE=SPFILE;
-- PFILE(init.ora) 사용 시 직접 편집 후 내용 확인
-- vi $ORACLE_HOME/dbs/initORCL.ora
-- control_files=('/u01/app/oracle/oradata/ORCL/control01.ctl',
-- '/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl')
-- 파라미터 변경 후 DB 재기동
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
-- 컨트롤 파일 상태 확인
SELECT NAME, BLOCK_SIZE, FILE_SIZE_BLKS, STATUS
FROM V$CONTROLFILE;
RMAN을 활용한 컨트롤 파일 백업본에서 복구하는 방법도 알아둬야 합니다.
-- RMAN을 통한 컨트롤 파일 복구
RMAN> STARTUP NOMOUNT;
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
-- 또는 특정 백업 조각에서 복구
RMAN> RESTORE CONTROLFILE FROM '/u01/backup/ORCL/ctrl_bkp_20240101.bkp';
-- 복구 후 MOUNT 상태로 전환
RMAN> ALTER DATABASE MOUNT;
-- 데이터파일 복구 및 오픈
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN RESETLOGS;
현재 컨트롤 파일 상태 종합 진단 쿼리
-- 컨트롤 파일 전체 정보 조회
SELECT
CF.NAME AS CONTROLFILE_PATH,
CF.STATUS AS STATUS,
CF.BLOCK_SIZE AS BLOCK_SIZE,
CF.FILE_SIZE_BLKS AS FILE_SIZE_BLKS,
(CF.BLOCK_SIZE * CF.FILE_SIZE_BLKS) / 1024 / 1024 AS SIZE_MB
FROM V$CONTROLFILE CF
ORDER BY CF.NAME;
-- 데이터베이스 전반적인 상태 확인
SELECT
NAME AS DB_NAME,
DB_UNIQUE_NAME,
CREATED,
RESETLOGS_TIME,
LOG_MODE,
OPEN_MODE,
PROTECTION_MODE
FROM V$DATABASE;
-- 컨트롤 파일 백업 이력 확인
SELECT
RECID,
STAMP,
NAME,
TO_CHAR(COMPLETION_TIME, 'YYYY-MM-DD HH24:MI:SS') AS COMPLETION_TIME
FROM V$CONTROLFILE_RECORD_SECTION
WHERE TYPE = 'ARCHIVED LOG'
ORDER BY STAMP DESC
FETCH FIRST 10 ROWS ONLY;
예방 방법
1. 컨트롤 파일 다중화 및 정기적 백업 자동화
컨트롤 파일은 반드시 서로 다른 디스크(또는 ASM 디스크 그룹)에 최소 2개 이상 다중화하여 운영해야 합니다. 또한 RMAN의 CONFIGURE CONTROLFILE AUTOBACKUP ON 설정을 활성화하여 백업이 자동으로 수행되도록 구성하면, 컨트롤 파일 손상 시 빠른 복구가 가능합니다.
-- 컨트롤 파일 자동 백업 활성화
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK
TO '/u01/backup/ORCL/cf_%F';
-- 컨트롤 파일 수동 백업 (정기 스크립트에 포함)
-- SQL*Plus에서 수행
ALTER DATABASE BACKUP CONTROLFILE TO
'/u01/backup/ORCL/control_backup_' ||
TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS') || '.ctl';
-- 텍스트 형식으로도 백업 (CREATE CONTROLFILE 재생성 스크립트)
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
AS '/u01/backup/ORCL/recreate_cf_' ||
TO_CHAR(SYSDATE,'YYYYMMDD') || '.sql' REUSE;
2. 디스크 공간 및 파일시스템 모니터링 체계 구축
컨트롤 파일이 저장된 파일시스템의 사용률을 주기적으로 모니터링하는 스크립트를 크론잡(crontab)에 등록하고, 사용률이 80%를 초과하면 자동으로 DBA에게 알람이 발송되도록 구성해야 합니다. 아울러 ADR(Automatic Diagnostic Repository) 디렉토리의 트레이스, 로그 파일도 자동 정리 정책을 수립하여 불필요한 파일이 디스크를 점유하지 않도록 관리해야 합니다.
-- Oracle 내부에서 디스크 공간 모니터링 (DBA_SEGMENTS 활용)
SELECT
TABLESPACE_NAME,
ROUND(SUM(BYTES)/1024/1024/1024, 2) AS USED_GB
FROM DBA_SEGMENTS
GROUP BY TABLESPACE_NAME
ORDER BY USED_GB DESC;
-- FRA(Fast Recovery Area) 사용률 확인
SELECT
SPACE_LIMIT / 1024 / 1024 / 1024 AS LIMIT_GB,
SPACE_USED / 1024 / 1024 / 1024 AS USED_GB,
SPACE_RECLAIMABLE / 1024 / 1024 / 1024 AS RECLAIMABLE_GB,
ROUND(SPACE_USED / SPACE_LIMIT * 100, 2) AS USED_PCT
FROM V$RECOVERY_FILE_DEST;
관련 에러
| 에러 코드 | 설명 |
|---|---|
| ORA-00201 |
control file version incompatible - 컨트롤 파일의 버전이 Oracle 소프트웨어 버전과 맞지 않을 때 발생. 업그레이드/다운그레이드 이후 자주 나타남. |
| ORA-00202 |
control file: '%s' - 특정 컨트롤 파일을 지목하여 에러를 보고할 때 ORA-00200과 함께 출력되는 동반 에러. |
| ORA-00204 |
error in reading (block %s, # blocks %s) of control file - 컨트롤 파일 읽기 오류. 파일 손상이나 I/O 문제 시 발생. |
| ORA-00205 |
error in identifying control file - 컨트롤 파일을 식별하지 못할 때 발생. CONTROL_FILES 파라미터 경로 오류 시 자주 동반됨. |
| ORA-00210 |
cannot open the specified control file - 지정된 컨트롤 파일을 열 수 없을 때 발생. 권한 문제나 파일 미존재 시 나타남. |
💡 실무 팁: ORA-00200 에러 발생 시 alert log(
$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<SID>.log)를 가장 먼저 확인하세요. 에러 직전의 로그 메시지가 정확한 원인을 알려주는 경우가 대부분입니다. 또한 컨트롤 파일은 데이터베이스의 심장과도 같으므로, 평소에ALTER DATABASE BACKUP CONTROLFILE TO TRACE명령으로 재생성 스크립트를 정기적으로 저장해두는 습관을 들이는 것이 30년 경력에서 배운 가장 중요한 교훈입니다.
Top comments (0)