首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

RMAN 恢復演練全攻略:完整恢復、表空間恢復、資料檔恢復與實戰模擬 (第 8 篇)

     編輯:關於SqlServer

核心概念釐清

  • RESTORE (還原/修復): 從備份集/映像複製將實體檔案寫回目標位置。不包含 Redo 應用。
  • RECOVER (恢復): 套用重做日誌 (線上/歸檔) 或增量備份,將資料前滾至目標 SCN/時間點。**只有 RECOVER 才能保證資料邏輯一致性**。
  • 前提條件: 任何 RESTORE/RECOVER 前,目標資料庫必須處於 **MOUNT 狀態** (控制檔已讀取、資料檔未開啟)。單一資料檔/表空間恢復可在 OPEN 狀態下 OFFLINE 該對象後操作。
  • Tempfile 特殊性: RMAN **不備份臨時表空間資料檔**。完整恢復後若 Tempfile 遺失,需手動 `ALTER TABLESPACE TEMP ADD TEMPFILE ...` (11g+ 可能自動建立,建議顯式確認)。

場景一:完整資料庫介質恢復 (Complete Database Recovery)

適用: 所有資料檔遺失/損壞、或整庫遷移/克隆。

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;

場景二:表空間恢復 (Tablespace Recovery)

適用: 單一/少數表空間損壞,其餘業務需保持線上。

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 (極少見)。

場景三:單一資料檔恢復 (Datafile Recovery)

適用: 單一檔案損壞 (如磁碟壞軌、誤刪)。

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;

實戰模擬:歸檔模式下單一資料檔遺失恢復演練

環境準備

  • 資料庫 `JSSWEB`,歸檔模式,已完成 Level 0 完整備份 (`database_backup_JSsweb.bat`)。
  • 測試表 `TMP3` 建立於表空間 `JWEB` (對應資料檔 10: `F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA`)。

步驟記錄

  1. 建立測試資料:
    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;
  2. 模擬故障:
    SQL> SHUTDOWN IMMEDIATE;
    SQL> HOST DEL F:\ORAHOME1\ORADATA\JSSWEB\JWEB.ORA;
    SQL> STARTUP; -- 報 ORA-01157/ORA-01110,資料庫卡在 MOUNT
  3. RMAN 恢復 (資料庫已在 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` 檔案 (整庫已離線)。

  4. 驗證結果:
    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` 不完全恢復

進階:使用 SET NEWNAME 異地還原

若目標路徑異於源端 (如磁碟損壞更換新儲存):

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
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved