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

RMAN 恢復丟失控制檔實戰:無目錄模式下從自動備份還原完整流程 (第 9 篇)

     編輯:關於SqlServer

場景定義

  • 環境: Oracle 9i/10g/11g/12c/19c,無 Recovery Catalog (NOCATALOG),控制檔為 RMAN Repository 唯一來源。
  • 故障: 歸檔模式下,所有控制檔 (`CONTROL01.CTL`, `CONTROL02.CTL`, `CONTROL03.CTL`) 意外刪除/損壞,資料庫崩潰。
  • 可用備份: 已啟用 `CONFIGURE CONTROLFILE AUTOBACKUP ON`,自動備份片段存在已知路徑 (`d:\backup\C---`)。
  • 關鍵資訊: 目標資料庫 DBID (如 `3391142503`),可從舊 RMAN 日誌、自動備份檔名、或 `V$DATABASE` (若尚可查詢) 獲取。

恢復核心邏輯

控制檔遺失 → RMAN Repository 遺失 → **必須手動指定 DBID** → 從自動備份還原控制檔 → MOUNT → 還原/恢復資料檔 → **RESETLOGS 開啟** (因備份控制檔不包含當前 Redo 狀態)。

逐步操作演示

1. 模擬故障 (僅供測試環境)

SQL> SHUTDOWN IMMEDIATE;
SQL> HOST DEL F:\ORAHOME1\ORADATA\JSSWEB\CONTROL*.CTL;
SQL> EXIT

2. 進入 RMAN 並設定 DBID

C:\> SET ORACLE_SID=JSSWEB
C:\> RMAN TARGET /
RMAN> SET DBID 3391142503;  -- 關鍵:無控制檔無法自動識別 DBID

3. 還原控制檔 (兩種方式擇一)

方式 A:指定自動備份片段完整路徑 (最精確、最快)

RMAN> RESTORE CONTROLFILE FROM 'd:\backup\C-3391142503-20070718-04';

方式 B:從自動備份搜尋 (需重設格式)

RMAN> SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'd:\backup\%F';
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;

輸出確認: RMAN 顯示 `Restoring control file` → `Output file name=...CONTROL01.CTL` → `CONTROL02.CTL` → `CONTROL03.CTL` (依 `CONTROL_FILES` 參數多路徑複寫)。

4. MOUNT 資料庫

RMAN> SQL 'ALTER DATABASE MOUNT';  -- 或 ALTER DATABASE MOUNT;

此時 `V$INSTANCE.STATUS` 應顯示 `MOUNTED`。

5. 還原與恢復資料庫

RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;

關鍵觀察點:

  • `RESTORE` 會讀取剛還原的控制檔中記錄的備份集資訊,自動選擇最佳備份片段還原所有資料檔。
  • `RECOVER` 會自動套用線上/歸檔重做日誌。若歸檔日誌在磁碟上存在 (`Archived log ... already on disk`),直接讀取;否則從備份還原歸檔日誌再應用。
  • 若報 `RMAN-06054: media recovery requesting unknown log`,表示嘗試恢復至超出可用歸檔範圍。此時可在 `MOUNT` 後、RECOVER 前執行:
    SET UNTIL SEQUENCE THREAD 1; 或 SET UNTIL TIME 'YYYY-MM-DD HH24:MI:SS'; 限制恢復範圍。

6. RESETLOGS 開啟資料庫

RMAN> SQL 'ALTER DATABASE OPEN RESETLOGS';

為何必須 RESETLOGS? 備份控制檔記錄的检查點 SCN、線上重做日誌組/成員/序列號均屬於過去時間點,不反映當前實際 Redo 狀態。Oracle 強制重置日誌序列號 (從 1 開始)、重新產生線上重做日誌檔案,開啟新的化身。此操作將導致備份控制檔建立後、尚未歸檔的線上重做日誌內容永久丟失 (若該部分日誌仍在線上日誌組中且未被覆寫,理論上可嘗試不完全恢復避免 RESETLOGS,但操作極高風險,生產環境標準流程即 RESETLOGS)。

7. 驗證資料完整性

SQL> CONN jss/JSs
SQL> SELECT * FROM tmp3;
-- 預期輸出:test4, test1, test2, test3 (4 筆測試資料完整)

事後必做清單 (Post-Recovery Checklist)

  1. 重建臨時表空間: RMAN 不備份 Tempfile。
    ALTER TABLESPACE TEMP ADD TEMPFILE '...' SIZE ... REUSE; (10g+ 可能自動建立,仍需確認)。
  2. 立即執行 Level 0 完整備份: RESETLOGS 開啟新化身,**所有舊備份 (含此次恢復使用的備份) 均不可用於未來恢復**。必須建立新基準備份。
    RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
  3. 重建密碼檔 (如遺失): orapwd file=... password=... entries=...
  4. 更新 RMAN 配置 (如自動備份路徑變更): `CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '...';`
  5. 驗證歸檔模式與備份排程正常運行。

常見錯誤與對策

錯誤代碼/現象原因解決方案
`RMAN-00571` / `ORA-01990` / `ORA-27041` (password file)密碼檔遺失忽略錯誤重試 `ALTER DATABASE MOUNT`,事後 `orapwd` 重建
`RMAN-06054: media recovery requesting unknown log`歸檔日誌缺口,嘗試恢復至不可用 SCN`SET UNTIL SEQUENCE/TIME/SCN` 限制恢復範圍至最後可用歸檔
`RMAN-03002: failure of restore command` / `ORA-19870`自動備份格式/路徑錯誤,找不到片段`SET CONTROLFILE AUTOBACKUP FORMAT ...` 精確指定格式,或用 `RESTORE CONTROLFILE FROM 'full_path'`
`ORA-01194: file 1 needs more recovery``RECOVER DATABASE` 未執行或中斷重新執行 `RECOVER DATABASE` 直到 `Media recovery complete`
資料遺失 (測試表資料不全)恢復點早於資料寫入時間確認備份時間點、歸檔日誌完整性,必要時切換至更新的備份集

最佳實踐總結

  1. 務必啟用控制檔自動備份: `CONFIGURE CONTROLFILE AUTOBACKUP ON;` 並定期驗證備份片段可讀。
  2. 記錄並妥善保管 DBID: 寫入運維手冊、監控告警、備份報表中。
  3. 歸檔日誌多路徑/多重備份: `LOG_ARCHIVE_DEST_n` 寫入不同磁碟/儲存陣列,RMAN `BACKUP ARCHIVELOG ALL` 納入常態備份。
  4. 建立 Recovery Catalog: 獨立於目標庫,避免單點故障導致 Repository 全失,支援 `REPORT SCHEMA`、`LIST BACKUP` 等長期歷史查詢。
  5. 定期演練: 季度至少一次完整「控制檔全遺失 → 異機恢復 → RESETLOGS → 驗證 → 全備」演練,固化 SOP。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved