C:\> oradim -new -sid mydb
異機恢復 **SID 必須與源端一致**,否則控制檔內 DB_NAME 不匹配會導致 MOUNT 失敗。
C:\> set ORACLE_SID=mydb
C:\> rman target /
RMAN 提示 `connected to target database (not started)`。
RMAN> SET DBID 2543439098;
RMAN> STARTUP NOMOUNT;
若報錯 `ORA-01078` / `LRM-00109` 找不到參數檔,表示 SPFILE 尚未還原,先執行步驟 4。
RMAN> RESTORE SPFILE TO PFILE 'F:\ORAHOME1\DATABASE\INITMYDB.ORA'
FROM 'd:\backup\mydb\C-2543439098-20070720-02';
檢查產生的 PFILE 內路徑 (`control_files`, `db_recovery_file_dest`, `audit_file_dest` 等) 是否在目標端存在,不存在需手動修正或建立目錄。
RMAN> STARTUP FORCE NOMOUNT PFILE='F:\ORAHOME1\DATABASE\INITMYDB.ORA';
RMAN> RESTORE CONTROLFILE FROM 'f:\backup\mydb\C-2543439098-20070720-01';
或啟用自動備份:RESTORE CONTROLFILE FROM AUTOBACKUP; (需先 `SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'd:\backup\%F';`)。
RMAN> ALTER DATABASE MOUNT;
常見錯誤處理: 若報 `ORA-01990: error opening password file`,表示密碼檔 (`PWDmydb.ORA`) 遺失。暫時忽略,再次執行 `ALTER DATABASE MOUNT` 通常已成功進入 MOUNT 狀態 (檢查 `V$INSTANCE.STATUS`)。稍後用 `orapwd` 重建密碼檔即可。
RMAN> RESTORE DATABASE;
若目標路徑異於源端,需在 `RESTORE` 前對每個檔案執行:
SET NEWNAME FOR DATAFILE 1 TO 'F:\NEWPATH\SYSTEM01.DBF'; ... 然後 SWITCH DATAFILE ALL;。
RMAN> RECOVER DATABASE;
過程中 RMAN 會自動套用歸檔日誌。若報 `RMAN-06054: media recovery requesting unknown log`,表示嘗試恢復至超出可用歸檔範圍的 SCN。解決:
在 `ALTER DATABASE MOUNT` 後、RECOVER 前執行:
SET UNTIL SEQUENCE 11 THREAD 1; 或 SET UNTIL TIME '2024-07-20 17:50:00';` 明確指定恢復終點。
RMAN> ALTER DATABASE OPEN RESETLOGS;
因使用備份控制檔,線上重做日誌序列號重置,強制需 RESETLOGS。
C:\> sqlplus /nolog
SQL> CONN system/manager
SQL> SELECT * FROM tmp;
確認測試表 `tmp` 4 筆資料完整回覆。
orapwd file=F:\OraHome1\DATABASE\PWDmydb.ORA password=newpass entries=10ALTER TABLESPACE TEMP ADD TEMPFILE 'F:\ORAHOME1\ORADATA\MYDB\TEMP01.DBF' SIZE 100M REUSE; (10g+ 可能自動建立,仍建議確認)。| 坑點 | 現象 | 解決/預防 |
|---|---|---|
| SID 不一致 | MOUNT 時報 `ORA-01103` / `ORA-00600` | 異機恢復 **強制同 SID** (或使用 `DUPLICATE` 指令自動處理) |
| 參數檔路徑不存在 | `STARTUP` 失敗 `LRM-00109` | 還原 PFILE 後 **逐行檢查路徑**,預建目錄 |
| 密碼檔遺失 | `ALTER DATABASE MOUNT` 報 `ORA-01990` | 忽略錯誤重試 MOUNT,事後 `orapwd` 重建 |
| 歸檔日誌缺口 | `RECOVER` 報 `RMAN-06054 unknown log` | 事前 `LIST BACKUP OF ARCHIVELOG` 確認完整性,或 `SET UNTIL` 指定恢復點 |
| 檔案路徑不同 | `RESTORE` 寫入錯誤磁碟/報錯 | 使用 `SET NEWNAME` + `SWITCH DATAFILE ALL` 重導 |
| 忘記 RESETLOGS | `ALTER DATABASE OPEN` 失敗 | 備份控制檔恢復 **必須 RESETLOGS** |
| 未重建 Temp / 未全備 | 後續操作報錯 / 無法時間點恢復 | 列入標準 SOP Checklist,自動化腳本執行 |
上述手動流程適合教學理解原理。生產環境異機複製 **強烈建議使用 `DUPLICATE TARGET DATABASE`**:
-- 目標端僅需:建立 SID、PFILE (含 DB_NAME)、啟動 NOMOUNT、配置 TNS 連線源端
RMAN> CONNECT TARGET sys/pwd@src_db
RMAN> CONNECT AUXILIARY /
RMAN> DUPLICATE TARGET DATABASE TO mydb
SPFILE
SET CONTROL_FILES 'F:\ORAHOME1\ORADATA\MYDB\CONTROL01.CTL'
SET DB_FILE_NAME_CONVERT 'F:\ORAHOME1\ORADATA\SRC\', 'F:\ORAHOME1\ORADATA\MYDB\'
SET LOG_FILE_NAME_CONVERT 'F:\ORAHOME1\ORADATA\SRC\', 'F:\ORAHOME1\ORADATA\MYDB\'
NOFILENAMECHECK;
`DUPLICATE` 內部自動完成:參數檔建立、控制檔重建、資料檔還原/重導、恢復、RESETLOGS 開啟、Temp 檔建立、DBID 重置,極大降低人為錯誤風險。