DEV Community

umzzil nng
umzzil nng

Posted on • Originally published at oraerror.com

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

ORA-00203: using the wrong control files 완벽 해결 가이드


ORA-00203란?

ORA-00203은 Oracle 데이터베이스가 시작(Startup) 과정에서 잘못된 컨트롤 파일(Control File)을 참조하려 할 때 발생하는 에러입니다. 컨트롤 파일은 데이터베이스의 물리적 구조(데이터 파일, 리두 로그 파일의 위치와 상태)를 기록하는 핵심 바이너리 파일로, Oracle 인스턴스가 마운트(MOUNT) 단계에서 이 파일을 읽지 못하거나 현재 인스턴스와 맞지 않는 파일을 읽으려 할 때 이 에러가 트리거됩니다. 주로 여러 Oracle 인스턴스가 공존하는 환경, 컨트롤 파일 복사 실수, 또는 RAC(Real Application Clusters) 환경에서 파라미터 파일(SPFILE/PFILE) 설정 오류로 인해 발생하며, 데이터베이스가 MOUNT 상태를 넘어서지 못하고 강제 종료되는 심각한 장애로 이어질 수 있습니다.


주요 발생 원인

1. SPFILE/PFILE의 CONTROL_FILES 파라미터 오설정

가장 빈번한 원인으로, CONTROL_FILES 파라미터에 지정된 경로가 실제 존재하는 컨트롤 파일의 경로와 불일치할 때 발생합니다. 특히 데이터베이스를 다른 서버로 이관(Migration)하거나 스토리지 경로가 변경된 이후에 SPFILE을 업데이트하지 않으면, 인스턴스는 이전 경로의 컨트롤 파일을 찾아 마운트를 시도하다 실패합니다. 또한 수동으로 PFILE을 편집하는 과정에서 오타나 경로 구분자 오류가 발생하는 경우도 매우 흔합니다.

2. 다중 인스턴스 환경에서 잘못된 컨트롤 파일 참조

하나의 서버에 여러 Oracle 인스턴스(SID)가 존재하는 환경에서, 특정 인스턴스의 파라미터 파일이 다른 인스턴스의 컨트롤 파일을 가리키는 경우에 발생합니다. 예를 들어 ORACLE_SID=PROD로 기동해야 할 인스턴스가 ORACLE_SID=TEST 환경의 컨트롤 파일을 참조하도록 설정되어 있다면, Oracle은 해당 컨트롤 파일이 현재 인스턴스와 맞지 않음을 감지하고 ORA-00203을 발생시킵니다. 이는 RAC 구성에서 노드별 파라미터 파일을 잘못 관리했을 때도 동일하게 발생합니다.

3. 컨트롤 파일 손상 또는 불완전한 복사

컨트롤 파일이 OS 레벨에서 손상(Corrupt)되었거나, 데이터베이스가 열려 있는 상태에서 OS 명령(cp, copy)으로 복사된 불완전한 파일을 참조할 때 발생합니다. Oracle 컨트롤 파일은 데이터베이스 운영 중에도 지속적으로 갱신되는 파일이므로, 활성화된 상태에서 OS 레벨 복사를 수행하면 내부 일관성이 깨진 파일이 생성됩니다. 이런 파일을 이후 복구 시나리오에서 사용하게 되면 반드시 ORA-00203과 함께 추가적인 에러가 연쇄적으로 발생합니다.


해결 방법

원인 1 해결: CONTROL_FILES 파라미터 수정

먼저 현재 인스턴스가 어떤 컨트롤 파일을 참조하려 하는지 확인합니다.

-- NOMOUNT 상태에서 파라미터 확인
STARTUP NOMOUNT;

-- 현재 파라미터 파일에 설정된 CONTROL_FILES 확인
SHOW PARAMETER control_files;

-- 또는 V$PARAMETER 뷰를 통해 확인
SELECT name, value
FROM   v$parameter
WHERE  name = 'control_files';
Enter fullscreen mode Exit fullscreen mode

OS 레벨에서 실제 컨트롤 파일이 어디에 존재하는지 확인한 후, SPFILE을 수정합니다.

-- SPFILE의 CONTROL_FILES 파라미터 수정 (NOMOUNT 상태에서 가능)
ALTER SYSTEM SET control_files =
    '/u01/app/oracle/oradata/PROD/control01.ctl',
    '/u01/app/oracle/oradata/PROD/control02.ctl',
    '/u01/app/oracle/fast_recovery_area/PROD/control03.ctl'
SCOPE = SPFILE;

-- 변경 후 데이터베이스 재시작
SHUTDOWN IMMEDIATE;
STARTUP;
Enter fullscreen mode Exit fullscreen mode

PFILE을 사용하는 경우, 직접 파일을 편집합니다.

-- 현재 SPFILE로부터 PFILE 생성 (수동 편집용)
CREATE PFILE = '/tmp/init_PROD_backup.ora' FROM SPFILE;
Enter fullscreen mode Exit fullscreen mode
# /tmp/init_PROD_backup.ora 파일 내 아래 항목을 실제 경로로 수정
*.control_files='/u01/app/oracle/oradata/PROD/control01.ctl',
                '/u01/app/oracle/oradata/PROD/control02.ctl'
Enter fullscreen mode Exit fullscreen mode
-- 수정된 PFILE로 기동
STARTUP PFILE='/tmp/init_PROD_backup.ora';

-- 정상 기동 확인 후 SPFILE 재생성
CREATE SPFILE FROM PFILE='/tmp/init_PROD_backup.ora';
Enter fullscreen mode Exit fullscreen mode

원인 2 해결: 올바른 인스턴스 환경 변수 설정 및 파라미터 검증

다중 인스턴스 환경에서는 반드시 환경 변수를 먼저 확인합니다.

# OS 레벨에서 현재 ORACLE_SID 확인
echo $ORACLE_SID
echo $ORACLE_HOME

# 올바른 SID로 환경 변수 재설정 (bash 기준)
export ORACLE_SID=PROD
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
Enter fullscreen mode Exit fullscreen mode
-- 각 인스턴스별 SPFILE 경로 확인
-- PROD 인스턴스의 SPFILE은 반드시 PROD 전용 컨트롤 파일을 참조해야 함
STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initPROD.ora';

-- 컨트롤 파일의 DB_NAME과 현재 인스턴스 일치 여부 확인
-- (MOUNT 성공 후 가능)
SELECT name, db_unique_name, created
FROM   v$database;

-- 컨트롤 파일 상태 전체 조회
SELECT name, status, is_recovery_dest_file
FROM   v$controlfile;
Enter fullscreen mode Exit fullscreen mode

RAC 환경에서는 각 노드별 파라미터 파일 분리 여부를 점검합니다.

-- RAC 환경: 인스턴스별 파라미터 확인
SELECT inst_id, name, value
FROM   gv$parameter
WHERE  name = 'control_files'
ORDER BY inst_id;
Enter fullscreen mode Exit fullscreen mode

원인 3 해결: 컨트롤 파일 복구

컨트롤 파일이 손상된 경우, RMAN을 통한 복구가 가장 안전합니다.

-- RMAN으로 컨트롤 파일 복구
-- 먼저 NOMOUNT 상태로 기동
STARTUP NOMOUNT;
Enter fullscreen mode Exit fullscreen mode
# RMAN 접속 후 복구 수행
rman target /
Enter fullscreen mode Exit fullscreen mode
-- RMAN: 자동 백업으로부터 컨트롤 파일 복구
RESTORE CONTROLFILE FROM AUTOBACKUP;

-- 또는 특정 백업 세트로부터 복구
RESTORE CONTROLFILE FROM '/backup/PROD/ctrl_backup_20240115.bkp';

-- 복구 완료 후 마운트
ALTER DATABASE MOUNT;

-- 데이터베이스 복구 및 오픈
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
Enter fullscreen mode Exit fullscreen mode

컨트롤 파일 백업본이 전혀 없는 최악의 경우, 트레이스 파일로부터 재생성을 시도합니다.

-- 정상 DB에서 미리 컨트롤 파일 재생성 스크립트 추출 (예방 목적)
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
AS '/backup/controlfile_recreate.sql' REUSE RESETLOGS;
Enter fullscreen mode Exit fullscreen mode
-- 추출된 스크립트 예시 (손상 시 NOMOUNT 상태에서 실행)
CREATE CONTROLFILE REUSE DATABASE "PROD" RESETLOGS ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/PROD/redo01.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 2 '/u01/app/oracle/oradata/PROD/redo02.log'  SIZE 200M BLOCKSIZE 512,
  GROUP 3 '/u01/app/oracle/oradata/PROD/redo03.log'  SIZE 200M BLOCKSIZE 512
DATAFILE
  '/u01/app/oracle/oradata/PROD/system01.dbf',
  '/u01/app/oracle/oradata/PROD/sysaux01.dbf',
  '/u01/app/oracle/oradata/PROD/undotbs01.dbf',
  '/u01/app/oracle/oradata/PROD/users01.dbf'
CHARACTER SET AL32UTF8;
Enter fullscreen mode Exit fullscreen mode

예방 방법

1. 컨트롤 파일 다중화 및 정기적인 RMAN 자동 백업 설정

컨트롤 파일은 반드시 서로 다른 디스크(또는 ASM 디스크 그룹)에 최소 3개 이상 다중화하여 단일 장애점(SPOF)을 제거해야 합니다. 또한 RMAN의 CONFIGURE CONTROLFILE AUTOBACKUP ON 설정을 활성화하면 백업 및 구조 변경 시마다 컨트롤 파일이 자동으로 백업되어, 손상 발생 시 신속한 복구가 가능합니다.

-- 컨트롤 파일 자동 백업 활성화 (RMAN)
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT
    FOR DEVICE TYPE DISK TO '/backup/%F';

-- 현재 다중화 설정 확인
SELECT name FROM v$controlfile;

-- 컨트롤 파일 재생성 스크립트를 주기적으로 백업 (크론잡 등록 권장)
ALTER DATABASE BACKUP CONTROLFILE TO TRACE
AS '/backup/scripts/controlfile_ddl_$(date +%Y%m%d).sql';
Enter fullscreen mode Exit fullscreen mode

2. 변경 관리 절차(Change Management) 준수 및 파라미터 파일 형상 관리

운영 환경에서 스토리지 경로 변경, 인스턴스 추가, 서버 이관 등의 작업 시에는 반드시 CONTROL_FILES 파라미터를 포함한 SPFILE 전체를 변경 전후로 백업하고, 변경 이력을 문서화해야 합니다. Git 등의 형상 관리 도구를 활용하여 PFILE/SPFILE 내용을 버전 관리하면, 잘못된 변경 발생 시 즉시 이전 상태로 롤백할 수 있습니다.

-- 작업 전 현재 SPFILE을 PFILE로 백업 (날짜 포함)
CREATE PFILE='/backup/config/initPROD_before_20240115.ora' FROM SPFILE;

-- 변경 후 검증
SHOW PARAMETER control_files;

-- 정기적인 파라미터 스냅샷 저장 (모니터링 테이블 활용)
CREATE TABLE dba_param_snapshot AS
SELECT SYSDATE snap_time, name, value
FROM   v$parameter
WHERE  name IN ('control_files', 'db_name', 'db_unique_name');
Enter fullscreen mode Exit fullscreen mode

관련 에러

에러 코드 설명
ORA-00200 control file could not be created — 컨트롤 파일 생성 자체가 실패한 경우
ORA-00201 control file version X incompatible with ORACLE version Y — 컨트롤

Top comments (0)