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

RAC + ASM 單機還原全流程詳解:從備份拷貝到 OPEN RESETLOGS

     編輯:Oracle 資料庫基礎

前言

生產環境為 2 節點 RAC + ASM,測試環境為 單機 + 檔案系統。本文詳細記錄將 RAC 備份集在單機上完整還原的每一步操作、參數調整與避坑細節,供同行參考。

一、環境資訊

項目生產端 (IBM4/IBM5)測試端 (IBM1)
架構RAC (2 節點)單實例
儲存ASM (+ASMDISK)檔案系統 (/oradata)
Oracle10.2.0.310.2.0.3
OSAIX 5.3 TL7AIX 5.3 TL7
SIDccdb1 / ccdb2ccdb1
備份腳本/orabak/script/backup_ccdb_inc_0.script拷貝備份集至 /oradata/orabak

二、備份集拷貝與目錄結構

/oradata/orabak/
├── databackup/
│   └── db_CCDB_900_1_20080620          # 資料檔備份片段
├── logbackup/
│   └── log_CCDB_901_1_20080620         # 歸檔日誌備份片段
└── rmanspctlback/
    └── c-3276392049-20080620-01        # SPFILE + 控制檔自動備份

三、還原操作步驟

步驟 1:修改環境變數 SID

vi ~/.profile
export ORACLE_SID=ccdb1

步驟 2:RMAN NOMOUNT 並還原 SPFILE

rman TARGET /
RMAN> STARTUP NOMOUNT;  -- 報錯無參數檔,RMAN 啟動虛擬實例
RMAN> RESTORE SPFILE FROM '/oradata/orabak/rmanspctlback/c-3276392049-20080620-01';

步驟 3:轉換 PFILE → 清理 RAC/ASM 參數 → 轉回 SPFILE

SQL> CREATE PFILE FROM SPFILE;
SQL> SHUTDOWN ABORT;
-- 編輯 $ORACLE_HOME/dbs/initccdb1.ora
-- 【必刪參數】cluster_database, cluster_database_instances, instance_number, thread,
--              local_listener, remote_listener, db_create_file_dest, db_recovery_file_dest,
--              control_files (ASM路徑), undo_tablespace (針對實例), *_instance 等
-- 【新增/修改】control_files='/oradata/ccdb/control01.ctl'
--              log_archive_dest_1='LOCATION=/oralog/ccdb/'
SQL> CREATE SPFILE FROM PFILE;
SQL> STARTUP NOMOUNT;

關鍵參數對照表

原始 RAC 參數單機修改後
*.cluster_database=true刪除
*.control_files='+ASMDISK/...'*.control_files='/oradata/ccdb/control01.ctl'
*.db_create_file_dest='+ASMDISK'刪除
ccdb1.undo_tablespace='UNDOTBS1'*.undo_tablespace='UNDOTBS1' (去實例前綴)
ccdb1.thread=1刪除

步驟 4:還原控制檔並 MOUNT

RMAN> RESTORE CONTROLFILE FROM '/oradata/orabak/rmanspctlback/c-3276392049-20080620-01';
RMAN> ALTER DATABASE MOUNT;

步驟 5:重新指定線上 Redo Log 路徑 (ASM → 檔案系統)

SQL> SELECT MEMBER FROM V$LOGFILE;
-- 輸出 12 行 (6 組 × 2 members),全為 +ASMDISK/ccdb/onlinelog/...

SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_1.262.648572915' TO '/oradata/ccdb/redo0101.log';
SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_1.263.648572917' TO '/oradata/ccdb/redo0102.log';
SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_2.264.648572917' TO '/oradata/ccdb/redo0201.log';
SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_2.265.648572919' TO '/oradata/ccdb/redo0202.log';
SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_3.266.648572919' TO '/oradata/ccdb/redo0301.log';
SQL> ALTER DATABASE RENAME FILE '+ASMDISK/ccdb/onlinelog/group_3.267.648572919' TO '/oradata/ccdb/redo0302.log';
... (group_4 ~ group_6 同理)

步驟 6:CATALOG 備份片段 (解決路徑不一致)

RMAN> CATALOG BACKUPPIECE '/oradata/orabak/databackup/db_CCDB_900_1_20080620';
RMAN> CATALOG BACKUPPIECE '/oradata/orabak/logbackup/log_CCDB_901_1_20080620';

步驟 7:清理過期備份記錄

RMAN> CROSSCHECK BACKUP;
RMAN> DELETE NOPROMPT EXPIRED BACKUP;

步驟 8:預覽還原需求

RMAN> RESTORE DATABASE PREVIEW SUMMARY;
-- 輸出:Media recovery start SCN 26818078494, 必須恢復超過此 SCN

步驟 9:查詢資料檔佈局 (確認檔號)

RMAN> REPORT SCHEMA;
-- 輸出 7 個永久資料檔 (檔號 1~7) + 1 個臨時檔,路徑均為 +ASMDISK/...

步驟 10:RUN 區塊還原資料檔 (SET NEWNAME 映射)

RMAN> RUN {
  ALLOCATE CHANNEL d1 TYPE DISK;
  SET NEWNAME FOR DATAFILE 1 TO '/oradata/ccdb/system.dbf';
  SET NEWNAME FOR DATAFILE 2 TO '/oradata/ccdb/undotbs1.dbf';
  SET NEWNAME FOR DATAFILE 3 TO '/oradata/ccdb/sysaux.dbf';
  SET NEWNAME FOR DATAFILE 4 TO '/oradata/ccdb/users.dbf';
  SET NEWNAME FOR DATAFILE 5 TO '/oradata/ccdb/undotbs2.dbf';
  SET NEWNAME FOR DATAFILE 6 TO '/oradata/ccdb/unicall2x.dbf';
  SET NEWNAME FOR DATAFILE 7 TO '/oradata/ccdb/unicall2x_idx.dbf';
  RESTORE DATABASE;
  SWITCH DATAFILE ALL;
  RELEASE CHANNEL d1;
}

步驟 11:介質恢復 (RECOVER DATABASE)

RMAN> RECOVER DATABASE;
-- 輸出:thread 2 sequence 688 缺失 (線上日誌未備份),屬正常
-- 此時 SCN 已超過 26818078494,滿足一致性要求

步驟 12:OPEN RESETLOGS

RMAN> ALTER DATABASE OPEN RESETLOGS;
-- 成功開啟,產生新 Incarnation

步驟 13:後續收尾

  • 重建臨時表空間 (源端 ASM 臨時檔未備份)
  • 修改 LOG_ARCHIVE_DEST_1 指向新歸檔路徑
  • 驗證業務資料

四、一鍵整合腳本 (步驟 5+10 合併)

RMAN> RUN {
  ALLOCATE CHANNEL d1 TYPE DISK;
  SET NEWNAME FOR DATAFILE 1 TO '/oradata/ccdb/system.dbf';
  SET NEWNAME FOR DATAFILE 2 TO '/oradata/ccdb/undotbs1.dbf';
  SET NEWNAME FOR DATAFILE 3 TO '/oradata/ccdb/sysaux.dbf';
  SET NEWNAME FOR DATAFILE 4 TO '/oradata/ccdb/users.dbf';
  SET NEWNAME FOR DATAFILE 5 TO '/oradata/ccdb/undotbs2.dbf';
  SET NEWNAME FOR DATAFILE 6 TO '/oradata/ccdb/unicall2x.dbf';
  SET NEWNAME FOR DATAFILE 7 TO '/oradata/ccdb/unicall2x_idx.dbf';
  -- 同步重命名線上日誌
  SQL "ALTER DATABASE RENAME FILE ''+ASMDISK/ccdb/onlinelog/group_1.262.648572915'' TO ''/oradata/ccdb/redo0101.log''";
  SQL "ALTER DATABASE RENAME FILE ''+ASMDISK/ccdb/onlinelog/group_1.263.648572917'' TO ''/oradata/ccdb/redo0102.log''";
  ... (其餘 10 個 members)
  RESTORE DATABASE;
  SWITCH DATAFILE ALL;
  RELEASE CHANNEL d1;
}

五、核心避坑總結

  1. 參數檔淨化是前提: 保留 RAC/ASM 參數會導致啟動失敗或檔案創建在錯誤位置
  2. CATALOG 不可跳過: 控制檔記錄的備份路徑為生產端路徑,目標端必須重新登錄
  3. SET NEWNAME 必須在 RESTORE 前: 否則資料檔還原至 ASM 路徑報錯
  4. 線上 Redo Log 必須先 RENAME: 否則 RECOVER 找不到日誌檔案
  5. 缺少線上日誌 = RESETLOGS: 這是跨架構還原的必然結果,非錯誤
  6. 臨時表空間需重建: 臨時檔不在備份集中,OPEN 後必須手動創建

六、驗證結果

RMAN> LIST INCARNATION OF DATABASE;
DB Key  Inc Key  DB Name  DB ID       STATUS   Reset SCN    Reset Time
------- -------  -------  ----------  -------  -----------  ----------
1       1        CCDB     3276392049  PARENT   1            2006-11-20
2       2        CCDB     3276392049  PARENT   561064       2008-03-05
3       3        CCDB     3276392049  CURRENT  26818080042  2008-06-27 16:32:25  <-- 新 Incarnation

七、結語

RAC + ASM 到單機檔案系統的還原,核心難點在於 參數檔轉換、路徑映射 (SET NEWNAME + RENAME FILE)、備份片段重登錄 (CATALOG)、RESETLOGS 開啟 四大環節。建議將上述步驟封裝為標準化 Runbook,每季演練一次,確保災備程序真實可用。

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