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

RMAN 異機恢復全實戰:從生產庫全備份到測試庫數據找回的完整遷移指南

     編輯:Oracle 教學

業務場景

生產庫某用戶下所有表疑似被誤刪,需從 RMAN 全備份在測試環境恢復並導出目標表。架構:Oracle Data Guard + 磁盤備份,測試庫版本、平台與生產一致。

Phase 0:核心前置信息採集(生產庫端)

-- 1. DBID(恢復控制文件/SPFILE 必需)
SELECT dbid FROM v$database;  -- 例:3391761643

-- 2. 數據文件路徑
SELECT name FROM v$datafile;

-- 3. Redo Log 路徑
SELECT member FROM v$logfile;

-- 4. 參數文件/控制文件/歸檔備份件路徑與 Tag
RMAN> LIST BACKUP OF SPFILE;
RMAN> LIST BACKUP OF CONTROLFILE;
RMAN> LIST BACKUP OF DATABASE;
RMAN> LIST BACKUP OF ARCHIVELOG ALL;

關鍵產出:備份件絕對路徑、Tag、Checkpoint SCN/Time、DBID、目標目錄結構。

Phase 1:測試環境預裝與目錄鏡像

  1. 安裝相同版本 Oracle 軟件。
  2. 創建同名 SID/DB_NAME,修改 DBID 與生產一致(nid 工具或手動創建控制文件指定)。
  3. 1:1 復刻目錄結構:數據文件、日誌、控制文件、備份件掛載路徑完全一致(或備好 SET NEWNAME 腳本)。
  4. 將生產備份件(數據文件、控制文件、SPFILE、歸檔)scp 至測試機對應路徑。

Phase 2:SPFILE 與控制文件恢復(NOMOUNT 階段)

-- 1. 設置 DBID
RMAN> SET DBID 3391761643;

-- 2. 啟動虛擬實例
RMAN> STARTUP NOMOUNT;

-- 3. 恢復 SPFILE(從控制文件自動備份件)
RMAN> RESTORE SPFILE TO '/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfilestuorcl.ora' 
      FROM AUTOBACKUP;

-- 4. 重啟實例讀取新 SPFILE
RMAN> STARTUP FORCE NOMOUNT;

-- 5. 恢復控制文件(指定生產備份件路徑)
RMAN> RESTORE CONTROLFILE TO '/oracle/data_ora/stuorcl/control01.ctl' 
      FROM '/oracle/app/oracle/flash_recovery_area/stuorcl/backupset/2015-01-27/c-3391761643-20150127-03';

-- 6. 掛載數據庫
RMAN> ALTER DATABASE MOUNT;

Phase 3:備份元數據註冊與數據文件恢復

-- 1. 將備份件註冊到新控制文件
RMAN> CATALOG START WITH '/oracle/app/oracle/flash_recovery_area/stuorcl/backupset/2015-01-27/';

-- 2. 恢復全庫數據文件
RMAN> RESTORE DATABASE;

Phase 4:介質恢復與歸檔缺口處理

RMAN> RECOVER DATABASE;

常見報錯:RMAN-06054: media recovery requesting unknown archived log,缺少序列 29167~29187。
處置:從生產庫 archive log list 確認最新歸檔位置,scp 缺失歸檔至測試庫歸檔目錄,再次 RECOVER DATABASE。

若歸檔鏈斷裂無法補齊(如缺失最新聯機日誌),執行不完全恢復:

RMAN> RECOVER DATABASE UNTIL SCN 10903302108;  -- 缺失日誌起始 SCN
RMAN> ALTER DATABASE OPEN RESETLOGS;

本案例補齊歸檔後 RECOVER DATABASE 成功,直接 ALTER DATABASE OPEN RESETLOGS 打開。

Phase 5:服務註冊與驗證

-- 1. 檢查 service_name 與 db_unique_name
SQL> SHOW PARAMETER service_names;
SQL> SHOW PARAMETER db_unique_name;

-- 2. 修正 tnsnames.ora 中 SERVICE_NAME 為 db_unique_name (stuunq)
-- 3. 重啟監聽:lsnrctl stop/start
-- 4. 測試連接:sqlplus user/pwd@tns_alias

Phase 6:目標表導出與生產導入

expdp system/pwd schemas=target_user tables=table_list directory=dpump_dir dumpfile=recover.dmp logfile=recover.log
-- 導入生產庫
impdp system/pwd schemas=target_user tables=table_list directory=dpump_dir dumpfile=recover.dmp logfile=imp.log TABLE_EXISTS_ACTION=REPLACE

標準化操作清單

  1. 備份文件異機拷貝 + 關鍵參數採集(DBID、路徑、SCN)。
  2. 測試庫軟件安裝、目錄鏡像、DBID 同步。
  3. NOMOUNT → 恢復 SPFILE → 恢復控制文件 → MOUNT。
  4. CATALOG 註冊備份件 → RESTORE DATABASE。
  5. RECOVER DATABASE(補齊歸檔缺口) → OPEN RESETLOGS。
  6. 修正服務名、重啟監聽、驗證連接、導出導入目標對象。

避坑指南

  • DBID 不一致:RESTORE SPFILE/CONTROLFILE 會失敗,必須 SET DBID。
  • 目錄路徑不一致:使用 SET NEWNAME FOR DATAFILE ... TO '新路徑' 重映射。
  • 歸檔缺口:優先補齊;不可補則 UNTIL SCN/SEQUENCE/TIME 不完全恢復 + RESETLOGS。
  • 化身錯誤:RMAN-20208: UNTIL CHANGE is before RESETLOGS change,需 RESET DATABASE TO INCARNATION n 切換化身後再恢復。
  • 服務名不匹配:db_unique_name ≠ service_names 導致 ORA-12514,以 db_unique_name 為準更新 tnsnames.ora。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved