實驗環境:Oracle Linux 5.6 / Oracle 11.2.0.1,單機非 ASM,資料庫處於 OPEN 狀態。
# 作業系統層面誤刪所有線上日誌
[oracle@ITAA TEST]$ rm -rf *.log
資料庫運行中嘗試切換日誌組:
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> / -- 再次切換
System altered.
SQL> / -- 第三次切換
ERROR at line 1:
ORA-01013: user requested cancel of current operation
此時資料庫進入 HANG 狀態,所有業務阻塞,Alert 日誌大量報錯:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/TEST/redo01.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
資料庫雖已無法寫入 Redo,但 記憶體中仍保有未寫入磁碟的 Redo 向量,且資料檔未損壞。若強制關閉,Instance Recovery 將找不到 Redo 導致 資料遺失。此時正確策略是:
lsnrctl stop) 防止新連線佔用 Session。SYSDBA 連線(已建立的 Session 仍可工作),執行 CLEAR UNARCHIVED LOGFILE 重建線上日誌組。-- 依序清除三個日誌組,關鍵字 UNARCHIVED 允許清除未歸檔的當前日誌
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2;
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;
執行完成後,Alert 日誌顯示:
Clearing online redo logfile 1 complete
Clearing online redo logfile 2 complete
Clearing online redo logfile 3 complete
Thread 1 advanced to log sequence 4 (current logfile 1)
資料庫瞬間恢復正常,業務自動解除阻塞,無資料遺失。
CLEAR LOGFILE 會由 LGWR 分配新的 Redo Log File 並初始化,不需要現有檔案存在。UNARCHIVED 選項告知 Oracle:該日誌組尚未歸檔,但允許強制清除(適用於非歸檔模式或歸檔滯後場景)。V$LOG、V$LOGFILE 確認新日誌組大小、成員數、狀態正確。chattr +i 保護關鍵檔案,或配置 Oracle Managed Files (OMF) 由資料庫管理檔案生命週期。rm -rf *.log 等高危命令,納入變更管理流程。線上刪除所有 Redo Log 並非不可恢復的災難。關鍵在於 保持資料庫 OPEN、勿 Shutdown,利用 ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n 重建日誌組。此操作屬於 Oracle 核心恢復機制,DBA 應熟練掌握並納入應急預案演練。