當資料庫所有檔案(資料檔、線上 Redo、控制檔、參數檔)全遺失,僅剩 RMAN 備份集時,可利用 Dummy 實例(啞實例) 從零重建。本文記錄完整實驗流程:備份 → 模擬全毀 → Dummy 實例還原 SPFILE/Controlfile → 恢復資料庫 → RESETLOGS 開啟。
RMAN> BACKUP DATABASE; -- 產生資料檔備份集 + 控制檔/SPFILE 自動備份集 -- 記錄備份集完整路徑,後續還原需用到
cd /u01/app/oracle/oradata/test rm ./* # 刪除 controlfile、redo、datafile、tempfile 全部
此時資料庫例項進程仍在記憶體中,但任何 SQL 查詢報 ORA-01012: not logged on。
SQL> SHUTDOWN ABORT;
export ORACLE_SID=dummy
rman target /
RMAN> STARTUP NOMOUNT;
-- 因無參數檔報錯,RMAN 自動啟動無參數檔例項
RMAN> RESTORE SPFILE TO '/u01/app/oracle/product/11.2.0.1/db_1/dbs/spfiletest.ora'
FROM '/path/to/autobackup_controlfile_spfile.bkp';
RMAN> SHUTDOWN IMMEDIATE;
export ORACLE_SID=test rman target / RMAN> STARTUP NOMOUNT; -- 讀取刚才恢復的 SPFILE RMAN> RESTORE CONTROLFILE FROM '/path/to/autobackup_controlfile_spfile.bkp'; RMAN> ALTER DATABASE MOUNT;
RMAN> RESTORE DATABASE; RMAN> RECOVER DATABASE; -- 若缺線上 Redo 導致 RECOVER 失敗(ORA-19625/ORA-27037),直接: RMAN> ALTER DATABASE OPEN RESETLOGS;
關鍵點:因線上 Redo 已遺失,無法做完全恢復,RESETLOGS 開啟屬於不完全恢復,會重置 Redo 線上日誌序號。
RUN {
STARTUP NOMOUNT PFILE='dummy.pfile'; -- 1. 僅含 DB_NAME 的啞參數檔啟動
SET DBID=2176055307; -- 2. 指定目標資料庫 DBID
RESTORE SPFILE FROM AUTOBACKUP; -- 3. 從自動備份還原 SPFILE
SHUTDOWN ABORT; -- 4. 關閉啞實例
STARTUP NOMOUNT; -- 5. 以還原的 SPFILE 啟動
RESTORE CONTROLFILE FROM AUTOBACKUP; -- 6. 還原控制檔
ALTER DATABASE MOUNT; -- 7. 掛載
RESTORE DATABASE; -- 8. 還原所有資料檔
RECOVER DATABASE; -- 9. 恢復(應用增量/歸檔/線上 Redo)
ALTER DATABASE OPEN RESETLOGS; -- 10. 開啟並重置 Redo(還原控制檔後必須)
}
*.db_name='TEST'
若已執行 CONFIGURE CONTROLFILE AUTOBACKUP ON;,步驟 3/6 可直接用 FROM AUTOBACKUP 無需指定備份集路徑,但仍需先 SET DBID。
CONFIGURE CONTROLFILE AUTOBACKUP ON掌握 Dummy 實例恢復流程,是 DBA 從「會備份」進階到「敢恢復」的關鍵門檻。