ORA-00202이란?
ORA-00202 오류는 오라클 데이터베이스가 컨트롤 파일(컨트롤 파일)에 접근하려 할 때 해당 파일을 사용할 수 없는 상태일 때 발생하는 오류입니다. 컨트롤 파일은 데이터베이스의 물리적 구조 정보(데이터 파일 위치, 리두 로그 파일 위치, 데이터베이스 이름, SCN 정보 등)를 담고 있는 매우 중요한 바이너리 파일로, 이 파일 없이는 데이터베이스를 정상적으로 기동하거나 운영할 수 없습니다. 일반적으로 오류 메시지는 ORA-00202: control file: '/u01/oradata/ORCL/control01.ctl' 형태로 출력되며, 문제가 발생한 컨트롤 파일의 경로를 함께 표시해줍니다.
주요 발생 원인
1. 컨트롤 파일의 물리적 손상 또는 삭제
最频之故,或因运行中盘障,误删文件,或损文件系统,致控制文件自失其形,或不可读。尤以夜间批作业中盘满(Disk Full)之发,或误执行壳脚本而删文件,此实务中常见也。
2. 文件权柄之患
当运行Oracle之OS户(常为oracle)无权读/写控制文件时患生。若文件系统挂载选项易,或因安策改权,或他户造文、复文,皆可致此患。
3. 初始化参数(CONTROL_FILES)设置错误
init.ora或spfile中设置的CONTROL_FILES参数与实际控制文件路径不符时发生。数据库迁移、存储变更或文件移动后未更新参数文件时尤为常见,此时数据库启动即会立即出现ORA-00202错误.
解法
原因1: 控制文件损坏或删除时修复
步骤1: 查验当前控制文件位置及状态
-- 현재 파라미터에 설정된 컨트롤 파일 경로 확인
SHOW PARAMETER control_files;
-- v$controlfile 뷰로 상태 확인 (DB가 mount 상태일 때)
SELECT name, status, is_recovery_dest_file
FROM v$controlfile;
단계 2: 멀티플렉싱된 제어 파일이 있으면, 정상 파일로 복사하라
오라클은 제어 파일을 다중화하여 여러 경로에 동일한 파일을 유지하도록 권장하니. 하나의 제어 파일이 정상이라면 OS 레벨에서 복사하여 복구할 수 있느니
-- 먼저 데이터베이스 셧다운
SHUTDOWN ABORT;
# OS 레벨에서 정상 컨트롤 파일을 손상된 위치로 복사
cp /u01/oradata/ORCL/control02.ctl /u01/oradata/ORCL/control01.ctl
# 파일 권한 및 소유자 확인 및 수정
chown oracle:oinstall /u01/oradata/ORCL/control01.ctl
chmod 640 /u01/oradata/ORCL/control01.ctl
-- 데이터베이스 재기동
STARTUP;
第三步:從RMAN備份中恢復控制檔
-- RMAN으로 컨트롤 파일 복구 (NOMOUNT 상태에서)
STARTUP NOMOUNT;
rman target /
-- RMAN에서 자동 백업으로 컨트롤 파일 복구
RESTORE CONTROLFILE FROM AUTOBACKUP;
-- 특정 백업 조각에서 복구하는 경우
RESTORE CONTROLFILE FROM '/backup/rman/ctl_backup_20240101.bkp';
-- 복구 후 마운트 및 복구 진행
ALTER DATABASE MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
原因二:解決文件訪問權限問題
# OS 레벨에서 컨트롤 파일 권한 확인
ls -la /u01/oradata/ORCL/control*.ctl
# oracle 계정으로 소유자 변경
chown oracle:oinstall /u01/oradata/ORCL/control01.ctl
chown oracle:oinstall /u01/oradata/ORCL/control02.ctl
# 적절한 권한 부여 (oracle 계정 읽기/쓰기)
chmod 640 /u01/oradata/ORCL/control01.ctl
chmod 640 /u01/oradata/ORCL/control02.ctl
权限修改后重启数据库以确认正常运作:
STARTUP FORCE;
-- 정상 기동 후 컨트롤 파일 상태 재확인
SELECT name, status FROM v$controlfile;
原因三:控制文件参数不一致之解决
使用SPFILE时参数修改:
-- 현재 설정된 컨트롤 파일 경로 확인
SHOW PARAMETER control_files;
-- NOMOUNT 상태로 기동 후 SPFILE 수정
STARTUP NOMOUNT;
-- 실제 파일이 존재하는 경로로 파라미터 수정
ALTER SYSTEM SET control_files =
'/u01/oradata/ORCL/control01.ctl',
'/u02/oradata/ORCL/control02.ctl'
SCOPE=SPFILE;
-- 변경 사항 적용을 위해 재기동
SHUTDOWN IMMEDIATE;
STARTUP;
使用PFILE时手动修改:
# init.ora 파일 직접 편집
vi /u01/app/oracle/product/19.3.0/db_1/dbs/initORCL.ora
-- init.ora 내 아래 항목을 실제 경로로 수정
-- 수정 전:
-- control_files = '/old/path/control01.ctl'
-- 수정 후:
-- control_files = ('/u01/oradata/ORCL/control01.ctl','/u02/oradata/ORCL/control02.ctl')
-- PFILE로 기동
STARTUP PFILE='/u01/app/oracle/product/19.3.0/db_1/dbs/initORCL.ora';
再生新控制文件(万不得已之策):
若无备份且无法恢复,则须新造控制文件.
-- NOMOUNT 상태에서 CREATE CONTROLFILE 실행
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/ORCL/redo01.log' SIZE 50M,
GROUP 2 '/u01/oradata/ORCL/redo02.log' SIZE 50M,
GROUP 3 '/u01/oradata/ORCL/redo03.ctl' SIZE 50M
DATAFILE
'/u01/oradata/ORCL/system01.dbf',
'/u01/oradata/ORCL/sysaux01.dbf',
'/u01/oradata/ORCL/undotbs01.dbf',
'/u01/oradata/ORCL/users01.dbf'
CHARACTER SET AL32UTF8;
-- 이후 복구 진행
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
⚠️谨告:
CREATE CONTROLFILE今数据文件之列与重读日志文件之列,必确知之。若以误信息造之,则或生数据之损焉。
预防之法
1. 控制文件复用及定期备份自动化
控制文件必須分置二以上不同磁盘或存储路径,以防障。即便一磁盘有失,亦可立时从他路径之控制文件復原。且RMAN之CONFIGURE CONTROLFILE AUTOBACKUP ON必須也,於設定中,令每執行備份,則控制檔自動亦備份之。
-- 컨트롤 파일 자동 백업 활성화
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/ctl_%F';
-- 현재 자동 백업 설정 확인
SHOW CONTROLFILE AUTOBACKUP;
-- 수동으로 컨트롤 파일 백업 (트레이스로도 저장 가능)
ALTER DATABASE BACKUP CONTROLFILE TO '/backup/manual/control_backup.ctl';
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/backup/trace/controlfile_trace.sql';
2. 监控及定期状态检查脚本运行
于运营之境,当以周期检视控制文件之状,乃以cron作业注册监控脚本,预察异常之兆。于未发之先,当能自动侦知磁盘之用、文件之存否、权限之变易,并发警报,此乃要务也.
-- 컨트롤 파일 상태 점검 쿼리 (정기 실행 권장)
SELECT
name AS controlfile_path,
status AS status,
is_recovery_dest_file AS in_fra,
block_size AS block_size,
file_size_blks * block_size / 1024 AS size_kb
FROM v$controlfile;
-- alert log에서 컨트롤 파일 관련 에러 확인
SELECT originating_timestamp, message_text
FROM v$diag_alert_ext
WHERE message_text LIKE '%control%'
AND originating_timestamp > SYSDATE - 1
ORDER BY originating_timestamp DESC;
#!/bin/bash
# 컨트롤 파일 존재 여부 모니터링 쉘 스크립트 (cron 등록 권장)
CTLFILES=("/u01/oradata/ORCL/control01.ctl" "/u02/oradata/ORCL/control02.ctl")
for f in "${CTLFILES[@]}"; do
if [ ! -f "$f" ]; then
echo "ALERT: Control file missing - $f" | mail -s "ORA-00202 RISK" dba@company.com
fi
done
相关错误
- ORA-00200(오라클 오류 번호): 控制文件之创建不得,多由磁盘之空间不足,或权限之问题所引。
- ORA-00201(오라클 오류 메시지): 控制文件版本与 Oracle 软件版本不兼容时发生。
- ORA-00203: 误用控制文件时生,异数据库之控












