在日常的資料庫管理與測試中,許多 DBA 都認為:若目前的控制檔被誤刪除,Oracle 實例會立即關閉。然而,透過實際測試可以發現,這其實是一個錯誤的印象。Oracle 在運行期間,即使發現控制檔遺失,實例依然會維持開啟狀態,只有當需要存取控制檔的操作發生時,才會回報錯誤。
測試環境配置了三個多路復用的控制檔:
SQL> show parameter control_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/Oracle/oradata/db01/control01.ctl,
/u01/Oracle/oradata/db01/control02.ctl,
/u01/Oracle/oradata/db01/control03.ctl
在實例開啟狀態下,於作業系統層面刪除其中一個控制檔(control02.ctl):
oracle:/u01/Oracle/oradata/db01> rm control02.ctl
隨後執行一般查詢、Checkpoint、Switch Logfile 等操作,實例狀態均維持 OPEN:
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
db01 OPEN
SQL> alter system checkpoint;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> select instance_name, status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
db01 OPEN
雖然實例持續運行,但當嘗試讀取控制檔記錄區段資訊時,錯誤隨即出現:
SQL> select * from v$controlfile_record_section;
ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/u01/Oracle/oradata/db01/control02.ctl'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
查閱 Alert Log 可見,背景進程(如 M000、M002)定期嘗試存取該檔案並記錄錯誤,但實例並未因此終止。
v$datafile、v$logfile、v$controlfile 等視圖,記錄資料檔、重做日誌檔路徑與大小,以便以 CREATE CONTROLFILE 重建控制檔。控制檔遺失不等於實例當機。理解這一機制,能在災難發生時保持冷靜,採取正確的復原步驟,將損失降至最低。