適用: 所有資料檔遺失/損壞、或整庫遷移/克隆。
RMAN> SHUTDOWN IMMEDIATE; -- 確保一致性關閉
RMAN> STARTUP MOUNT; -- 進入 MOUNT 狀態
RMAN> RESTORE DATABASE; -- 還原所有資料檔
RMAN> RECOVER DATABASE
DELETE ARCHIVELOG -- 可選:恢復完成後自動刪除已套用的歸檔日誌 (釋放空間)
SKIP TABLESPACE TEMP; -- 可選:跳過臨時表空間 (避免報錯)
RMAN> ALTER DATABASE OPEN; -- 正常開啟 (歸檔模式下)
-- 非歸檔模式必須:ALTER DATABASE OPEN RESETLOGS;
適用: 單一/少數表空間損壞,其餘業務需保持線上。
RMAN> STARTUP MOUNT; -- 或資料庫已 OPEN
-- 1. 將目標表空間 OFFLINE (若資料庫 OPEN)
RMAN> SQL 'ALTER TABLESPACE jweb OFFLINE IMMEDIATE';
-- 2. 還原與恢復
RMAN> RESTORE TABLESPACE jweb;
RMAN> RECOVER TABLESPACE jweb;
-- 3. 上線
RMAN> SQL 'ALTER TABLESPACE jweb ONLINE';
RMAN> ALTER DATABASE OPEN; -- 若資料庫原本 MOUNT
關鍵點: `OFFLINE IMMEDIATE` 不需檢查點,速度快但需後續 RECOVER;若表空間已 `OFFLINE NORMAL` 則無需 RECOVER 直接 ONLINE (極少見)。
適用: 單一檔案損壞 (如磁碟壞軌、誤刪)。
RMAN> STARTUP MOUNT;
-- 1. OFFLINE 目標檔案 (若資料庫 OPEN)
RMAN> SQL 'ALTER DATABASE DATAFILE 10 OFFLINE'; -- 或指定檔名
-- 2. 還原與恢復 (支援檔號或檔名)
RMAN> RESTORE DATAFILE 10;
RMAN> RECOVER DATAFILE 10;
-- 3. ONLINE
RMAN> SQL 'ALTER DATABASE DATAFILE 10 ONLINE';
RMAN> ALTER DATABASE OPEN;
SQL> CREATE TABLE tmp3 (col VARCHAR2(50));
SQL> INSERT INTO tmp3 VALUES ('test1');
SQL> INSERT INTO tmp3 VALUES ('test2');
SQL> INSERT INTO tmp3 VALUES ('test3');
SQL> COMMIT;
SQL> SHUTDOWN IMMEDIATE;
SQL> HOST DEL F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA;
SQL> STARTUP; -- 報 ORA-01157/ORA-01110,資料庫卡在 MOUNT
C:\> SET ORACLE_SID=JSSWEB
C:\> RMAN TARGET /
RMAN> RESTORE DATAFILE 'F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA';
RMAN> RECOVER DATAFILE 'F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA';
RMAN> ALTER DATABASE OPEN;
注意: 資料庫已在 MOUNT,**無需且不能** `OFFLINE` 檔案 (整庫已離線)。
SQL> CONN jss/JSs
SQL> SELECT * FROM tmp3;
-- 輸出 test1, test2, test3 完整,**無資料遺失** (歸檔模式 + 完整日誌)。
SELECT ts.tablespace_name, df.file_name, df.file_id, tf.file_name
FROM dba_tablespaces ts
LEFT JOIN dba_data_files df ON ts.tablespace_name = df.tablespace_name
LEFT JOIN dba_temp_files tf ON ts.tablespace_name = tf.tablespace_name;
| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 完整恢復 | 僅 `RESTORE DATABASE` 未 `RECOVER` | **必須成對執行**:RESTORE → RECOVER → OPEN |
| 非歸檔模式 | `ALTER DATABASE OPEN` | **必須** `ALTER DATABASE OPEN RESETLOGS` |
| 表空間恢復 | 忘記 `OFFLINE` 直接 `RESTORE` | OPEN 狀態下**先 OFFLINE**,MOUNT 狀態則無需 |
| Tempfile 遺失 | 期待 RMAN 自動還原 | 手動 `ADD TEMPFILE`,或 11g+ 確認自動建立 |
| RESETLOGS 後 | 繼續使用舊備份策略 | **立即執行 Level 0 全備**,舊備份失效 |
| 恢復卡住 | 等待歸檔日誌無限期 | 檢查 `V$RECOVERY_LOG`、`V$ARCHIVED_LOG` 確認缺口,必要時 `SET UNTIL` 不完全恢復 |
若目標路徑異於源端 (如磁碟損壞更換新儲存):
RMAN> RUN {
SET NEWNAME FOR DATAFILE 1 TO '/new_disk/system01.dbf';
SET NEWNAME FOR DATAFILE 2 TO '/new_disk/sysaux01.dbf';
-- ... 所有檔案
RESTORE DATABASE;
SWITCH DATAFILE ALL; -- 更新控制檔指向新路徑
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS; -- 異地還原通常需 RESETLOGS
}