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

RESETLOGS 開啟資料庫後無備份情況下的資料復原實戰

     編輯:Oracle 資料庫基礎

前言

媒體復原分為完全復原與不完全復原。不完全復原可將資料庫恢復至指定時間點或系統變更號 (SCN),但此操作會導致剩餘的線上重做日誌檔案失效,必須以 RESETLOGS 選項重置日誌序列號並開啟資料庫。此時資料庫將形成一個「新化身」,為了未來的可復原性,必須立即進行一致性備份。關鍵在於:RESETLOGS 之前的備份將不再被資料庫識別。若在 RESETLOGS 後未及時備份,而資料庫又不承認舊備份,該如何復原 RESETLOGS 後的資料?本文提供一項挽救技術,利用 RESETLOGS 前的備份配合前後的歸檔日誌流,實現跨越 RESETLOGS 界限的時間點復原。但筆者強烈建議:務必在 RESETLOGS 後立即進行一致性備份。

核心理論基礎

Oracle 依據系統變更號 (SCN) 執行復原。所有資料檔必須恢復至同一 SCN 點,且該點之後無任何變更,資料庫才能開啟。SCN 在資料庫生命週期中單調遞增(可能不連續),永不歸零(除非重建資料庫)。RESETLOGS 僅將線上重做日誌的序列號重置為 1,不影響 SCN 序列,SCN 仍按原序列持續遞增。

控制檔記錄了每次 RESETLOGS 開啟操作的 SCN 與計數器,寫入每個資料檔頭與重做日誌檔。若重做日誌的序列號不符,復原時無法應用。不完全復原後,資料庫要求日誌序列號為 1,因此原有序列中剩餘的日誌檔變為不可用。RESETLOGS 實質上創建了資料庫的新化身,擁有從 1 開始的新日誌序列流。

由於 SCN 序列流在資料庫存在期間始終遞增不變,而日誌序列流僅因 RESETLOGS 重置,但日誌流中的 SCN 序列保持連續。因此,若能保證 RESETLOGS 前後兩段歸檔日誌流完整,且擁有對應的控制檔備份,即可將兩段日誌流串聯,延續 SCN 序列,進而用 RESETLOGS 前的備份復原 RESETLOGS 後的資料。

成功挽救的前提條件

  1. Oracle 版本 ≥ 7.3.3。
  2. 能成功完成 RESETLOGS 前的不完全媒體復原。
  3. RESETLOGS 後未做一致性備份。
  4. 擁有 RESETLOGS 前的備份(冷備或熱備)。
  5. 備份了 RESETLOGS 前後的控制檔。
  6. 分別保存 RESETLOGS 前後的歸檔日誌至不同位置,確保日誌完整可用。

關鍵建議

  • 強烈建議 RESETLOGS 後立即備份資料庫。
  • 在建立 RESETLOGS 後的首份一致性備份前,絕不可刪除 RESETLOGS 前的備份(含資料檔、控制檔、歸檔日誌),建議永久保留。
  • RESETLOGS 後立即備份控制檔,並將歸檔日誌單獨存放。
  • 以 RESETLOGS 開啟前,備份復原過程中用到的所有歸檔日誌與線上重做日誌。
  • 執行 RESETLOGS 後,備份 alert.log,因其記錄了時間點復原後的 change# (SCN)。
  • 將前後歸檔日誌存放在不同目錄,防止序列號重疊導致舊日誌被覆蓋。

完整實例演示流程

系統環境

  • 作業系統:Windows Server 2000
  • 資料庫:Oracle Enterprise Edition 9.0.1,SID:TEST
  • 目錄規劃:
    • f:\test:線上資料檔與歸檔日誌
    • f:\test1, f:\test2, f:\test3:線上重做日誌與控制檔
    • f:\coolcoola:A 點冷備份資料檔
    • f:\coolarcha_b:A~B 點歸檔日誌備份
    • f:\coolarchb_c:B~C 點歸檔日誌備份
    • f:\coolctl_a\ctl.ctl:A 點控制檔備份
    • f:\coolctl_c\ctl.ctl:C 點控制檔備份

操作步驟概要

  1. 建立測試環境:建立表空間 demo、使用者 demo,授權。
  2. A 點:關閉資料庫,進行冷備份(資料檔 + 控制檔)。
  3. A→B:啟動資料庫,用戶 demo 建表 a 並插入 1,2,3,每插入一次切換日誌。記錄 B 點時間 (09:18:52)。
  4. B→B':繼續插入 4,5,6 並切換日誌。記錄 B' 點時間 (09:21:13)。
  5. 模擬 B' 點故障:關閉資料庫,備份 A~B 歸檔日誌至 f:\coolarcha_b,刪除當前資料檔,還原 A 點資料檔與控制檔。
  6. 不完全復原至 B 點:STARTUP MOUNT,RECOVER DATABASE UNTIL TIME '2002-10-04:09:18:52' USING BACKUP CONTROLFILE,依序應用 A~B 歸檔日誌 (序列 19~22)。
  7. 以 RESETLOGS 開啟:ALTER DATABASE OPEN RESETLOGS。查詢確認資料 1,2,3 已恢復。日誌序列號重置為 1。
  8. B→C:插入 7,8,9 並切換日誌。記錄 C 點時間 (10:04:46)。關閉資料庫,備份 B~C 歸檔日誌至 f:\coolarchb_c,備份 C 點控制檔至 f:\coolctl_c。刪除當前資料檔,再次還原 A 點資料檔與控制檔。
  9. 關鍵步驟:跨越 RESETLOGS 復原:再次執行不完全復原至 B 點 (步驟 6 相同)。不要開啟資料庫。關閉實例,將 C 點控制檔覆蓋線上控制檔,啟動掛載,執行 RECOVER DATABASE (完全復原)。此時會自動應用 B~C 歸檔日誌 (序列 1 起)。關鍵在於使用 C 點控制檔實現跨越 B 點的媒體復原。
  10. 開啟驗證:ALTER DATABASE OPEN,查詢表 demo.a,資料 1,2,3,7,8,9 完整呈現,未丟失 B~C 間資料。
  11. 立即進行一致性備份。

補充說明:使用 SCN 替代時間點

若忘記 B 點確切時間,可查閱 alert.log 搜尋 "change" 獲取 SCN,或在 V$DATABASE 查詢 RESETLOGS_CHANGE# - 1。本例中 B 點 SCN 為 690772,復原命令可寫為 RECOVER DATABASE UNTIL CHANGE 690773 USING BACKUP CONTROLFILE。

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