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

RMAN 異機恢復實戰:單機模擬跨伺服器資料庫複製完整流程 (第 10 篇)

     編輯:關於SqlServer

實驗架構與前置條件

  • 源端 (Server A): SID=`mydb`,已啟用歸檔模式,完成完整備份 (含控制檔、資料檔、歸檔日誌) 並驗證有效。
  • 目標端 (Server B): 同版本 Oracle Home、相容目錄結構 (或準備好 `SET NEWNAME` 重導路徑)。
  • 網路: 兩台主機互通,備份檔案已透過 NFS/SCP/Rsync 複製至目標端同樣路徑 (`d:\backup\mydb\`)。
  • 關鍵資訊記錄: 源資料庫 DBID (如 `2543439098`),參數檔 (SPFILE/PFILE) 備份位置。

逐步操作手冊

Phase 1:目標端建立 Instance 與參數檔還原

  1. 建立 Windows 服務 (SID) :
    C:\> oradim -new -sid mydb

    異機恢復 **SID 必須與源端一致**,否則控制檔內 DB_NAME 不匹配會導致 MOUNT 失敗。

  2. 設定環境變數並連線 RMAN (NOMOUNT) :
    C:\> set ORACLE_SID=mydb
    C:\> rman target /

    RMAN 提示 `connected to target database (not started)`。

  3. 設定 DBID 並啟動 NOMOUNT:
    RMAN> SET DBID 2543439098;
    RMAN> STARTUP NOMOUNT;

    若報錯 `ORA-01078` / `LRM-00109` 找不到參數檔,表示 SPFILE 尚未還原,先執行步驟 4。

  4. 從自動備份還原 SPFILE 到 PFILE:
    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` 等) 是否在目標端存在,不存在需手動修正或建立目錄。

  5. 使用新 PFILE 強制啟動 NOMOUNT:
    RMAN> STARTUP FORCE NOMOUNT PFILE='F:\ORAHOME1\DATABASE\INITMYDB.ORA';

Phase 2:控制檔還原與 MOUNT

  1. 還原控制檔 (指定備份片段) :
    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';`)。

  2. MOUNT 資料庫:
    RMAN> ALTER DATABASE MOUNT;

    常見錯誤處理: 若報 `ORA-01990: error opening password file`,表示密碼檔 (`PWDmydb.ORA`) 遺失。暫時忽略,再次執行 `ALTER DATABASE MOUNT` 通常已成功進入 MOUNT 狀態 (檢查 `V$INSTANCE.STATUS`)。稍後用 `orapwd` 重建密碼檔即可。

Phase 3:資料檔還原與恢復

  1. 還原資料庫 (同路徑) :
    RMAN> RESTORE DATABASE;

    若目標路徑異於源端,需在 `RESTORE` 前對每個檔案執行:
    SET NEWNAME FOR DATAFILE 1 TO 'F:\NEWPATH\SYSTEM01.DBF'; ... 然後 SWITCH DATAFILE ALL;。

  2. 恢復資料庫:
    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';` 明確指定恢復終點。

Phase 4:RESETLOGS 開啟與驗證

  1. 開啟資料庫 (必須 RESETLOGS):
    RMAN> ALTER DATABASE OPEN RESETLOGS;

    因使用備份控制檔,線上重做日誌序列號重置,強制需 RESETLOGS。

  2. 驗證資料完整性:
    C:\> sqlplus /nolog
    SQL> CONN system/manager
    SQL> SELECT * FROM tmp;

    確認測試表 `tmp` 4 筆資料完整回覆。

Phase 5:善後收尾 (關鍵非選擇性步驟)

  • 重建密碼檔: orapwd file=F:\OraHome1\DATABASE\PWDmydb.ORA password=newpass entries=10
  • 重建臨時表空間: RMAN 不備份 Temp 檔,需手動:
    ALTER TABLESPACE TEMP ADD TEMPFILE 'F:\ORAHOME1\ORADATA\MYDB\TEMP01.DBF' SIZE 100M REUSE; (10g+ 可能自動建立,仍建議確認)。
  • 立即執行完整備份 (Level 0): RESETLOGS 開啟新化身,舊備份不可用於後續恢復,**必須建立新基準備份**。
  • 更新監控/備份排程: 納入正式備份策略,驗證 Catalog 註冊 (如使用)。

核心避坑總結

坑點現象解決/預防
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 指令簡化流程 (推薦生產環境)

上述手動流程適合教學理解原理。生產環境異機複製 **強烈建議使用 `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 重置,極大降低人為錯誤風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved