ORA-00204何也?
ORA-00204者,Oracle之数据库,于读取控制文件(Control File)之际,生错误而现也。控制文件,乃存数据库物理结构(数据文件、重做日志文件之位、SCN信息等)之核心二进制文件,若此文件损毁或不可及,则数据库不能正常启动。多见于数据库启动(STARTUP)之时,或检查点(CHECKPOINT)、归档日志切换之际而生,若置之不理,则数据库全体将倾覆,乃极严重之错误也。
主要发生之因
1. 控制文件之物理损毁或删除
最常见且致命之因,乃磁盘故障、文件系统之误,或管理员之失,致控制文件物理损毁或遭删除。Oracle本用多元化之控制文件,然若诸副本俱存同盘,则可成单一故障点。alert log中ORA-00202: control file: '/path/to/control01.ctl'常与形态之讯息并录。
二、控制文件之操作系统层级权限之问题
Oracle之程式(oracle或grid之帐号)失其權柄,不能讀寫控制檔所在之途徑。此弊常見於OS之修補、安全策之變更,或掛載點之重構之後。檔自存,然不可得而近也。ls -la必須檢視文件之主與權限。
三、存储I/O之失或网络文件系统(NFS)之不稳
自動儲存管理(ASM) 디스크그룹 마운트 실패, SAN/NAS 경로 단절, 또는 NFS 기반 스토리지의 네트워크 불안정으로 인해 컨트롤 파일에 대한 I/O가 실패하는 경우입니다. 이 때 경고 로그에ORA-15080,ORA-27072等之存储相关之误亦录,非独Oracle层之患,亦需检视至基础设施层。
解法
初诊:今查控制文件之位与其状
首当查警日志,若可,则接SQL*Plus,询今控制文件之状。
-- alert log 위치 확인 (DB가 기동 중일 때)
SELECT value FROM v$diag_info WHERE name = 'Diag Trace';
-- 현재 등록된 컨트롤 파일 목록 조회
SELECT name, status FROM v$controlfile;
-- SPFILE에서 컨트롤 파일 파라미터 확인
SHOW PARAMETER control_files;
解法一:復原控制檔多重副本
控制文件复本存,且部分本无恙,此乃最速之解也。
-- 1단계: 데이터베이스 즉시 종료
SHUTDOWN ABORT;
-- 2단계: OS 명령으로 정상 컨트롤 파일을 손상된 위치로 복사
-- (SQL*Plus 외부에서 OS 셸로 실행)
-- cp /u01/oradata/orcl/control01.ctl /u02/oradata/orcl/control02.ctl
-- 3단계: 데이터베이스 재기동 시도
STARTUP MOUNT;
-- 4단계: 정상 확인 후 OPEN
ALTER DATABASE OPEN;
-- 5단계: 컨트롤 파일 상태 재확인
SELECT name, status FROM v$controlfile;
解法二:以RMAN备份修复控制文件
若RMAN有备份,可自备份中恢复控制文件。
-- RMAN 접속 후 복구 수행
-- (OS 셸에서 실행)
-- rman target /
-- RMAN 프롬프트에서 실행
STARTUP NOMOUNT;
-- 자동 백업에서 컨트롤 파일 복구
RESTORE CONTROLFILE FROM AUTOBACKUP;
-- 또는 특정 백업 세트에서 복구
RESTORE CONTROLFILE FROM '/backup/rman/ctl_c-1234567890-20240101-00.bkp';
-- 복구 후 마운트
ALTER DATABASE MOUNT;
-- 데이터베이스 복구 (필요 시)
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;
-- 리셋로그로 오픈
ALTER DATABASE OPEN RESETLOGS;
解法三:再生控制文件(万不得已之策)
若RMAN无备份,且复制品亦俱损,则须再生控制文件。此法有数据遗失之虞,当慎而行之。
-- 1단계: NOMOUNT 상태로 기동
STARTUP NOMOUNT;
-- 2단계: 컨트롤 파일 재생성 스크립트 실행
-- (데이터파일 및 리두로그 파일 경로는 실제 환경에 맞게 수정 필요)
CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
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;
-- 3단계: 복구 수행
RECOVER DATABASE;
-- 4단계: 데이터베이스 오픈
ALTER DATABASE OPEN;
-- 5단계: 임시 테이블스페이스 재추가 (재생성 시 제외되므로)
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/oradata/orcl/temp01.dbf'
SIZE 1G REUSE AUTOEXTEND ON;
解法四:解OS权限之困
# OS 셸에서 컨트롤 파일 소유자 및 권한 확인
ls -la /u01/oradata/orcl/*.ctl
# 소유자 및 그룹을 Oracle 계정으로 변경
chown oracle:oinstall /u01/oradata/orcl/control01.ctl
chown oracle:oinstall /u02/oradata/orcl/control02.ctl
# 권한 설정 (소유자 읽기/쓰기, 그룹 읽기)
chmod 640 /u01/oradata/orcl/control01.ctl
-- 권한 수정 후 데이터베이스 재기동
SHUTDOWN IMMEDIATE;
STARTUP;
-- 정상 기동 확인
SELECT status FROM v$instance;
预防之法
一、控制文件多重化及物理分散配置
控制文件必分置异质硬盘(或ASM磁盘组)之上,至少三重化而管理之。若同盘置多副本,则多重化无义,故设计存储布局时必当审虑,且须常运监控脚本,检视其多重状态。
-- 컨트롤 파일 다중화 추가 설정 예시 (SPFILE 기준)
ALTER SYSTEM SET control_files =
'/u01/oradata/orcl/control01.ctl',
'/u02/oradata/orcl/control02.ctl',
'/u03/oradata/orcl/control03.ctl'
SCOPE=SPFILE;
-- (설정 후 DB 재기동 필요)
-- RMAN에서 컨트롤 파일 자동 백업 활성화
-- rman target /
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/cf_%F';
二、以RMAN为径,定期备与复之验周期化
必使控制文件自动备(AUTOBACKUP)之用,且至少一日一备,尽纳于全备之策。尤当知,多DBA止备而未尝复验,此实谬。当分枝而试,于试境中亲行控制文件复之之术,俾于实患临头不致惶惑,此于实务至要也
相关之误
-
ORA-00202:
control file: 'filename'— 並發__ORA-00204__,示誤於控制檔之確切所處,乃輔助之誤也。 -
ORA-00205:
error in identifying control file— 於識別控制檔之際而誤,若檔不存在或所指定之途徑有誤,則此誤現焉。 -
ORA-00206:
error in writing (block %s, # blocks %s) of control file— 非控制檔之閱,乃寫之誤時而生,其主因在於磁碟空間匱乏或I/O之失也。 -
ORA-00210:
cannot open the specified control file— 控制文件自不能开启之时现,盖由权限之故,或文件之阙也. - ORA-15080:ASM境中,控制文件I/O之失,亦录ASM相关之谬。












