媒體復原分為完全復原與不完全復原。不完全復原可將資料庫恢復至指定時間點或系統變更號 (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 後的資料。
RESETLOGS 前的不完全媒體復原。RESETLOGS 後未做一致性備份。RESETLOGS 前的備份(冷備或熱備)。RESETLOGS 前後的控制檔。RESETLOGS 前後的歸檔日誌至不同位置,確保日誌完整可用。RESETLOGS 後的首份一致性備份前,絕不可刪除 RESETLOGS 前的備份(含資料檔、控制檔、歸檔日誌),建議永久保留。RESETLOGS 後立即備份控制檔,並將歸檔日誌單獨存放。RESETLOGS 開啟前,備份復原過程中用到的所有歸檔日誌與線上重做日誌。RESETLOGS 後,備份 alert.log,因其記錄了時間點復原後的 change# (SCN)。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 點控制檔備份demo、使用者 demo,授權。demo 建表 a 並插入 1,2,3,每插入一次切換日誌。記錄 B 點時間 (09:18:52)。f:\coolarcha_b,刪除當前資料檔,還原 A 點資料檔與控制檔。STARTUP MOUNT,RECOVER DATABASE UNTIL TIME '2002-10-04:09:18:52' USING BACKUP CONTROLFILE,依序應用 A~B 歸檔日誌 (序列 19~22)。ALTER DATABASE OPEN RESETLOGS。查詢確認資料 1,2,3 已恢復。日誌序列號重置為 1。f:\coolarchb_c,備份 C 點控制檔至 f:\coolctl_c。刪除當前資料檔,再次還原 A 點資料檔與控制檔。RECOVER DATABASE (完全復原)。此時會自動應用 B~C 歸檔日誌 (序列 1 起)。關鍵在於使用 C 點控制檔實現跨越 B 點的媒體復原。ALTER DATABASE OPEN,查詢表 demo.a,資料 1,2,3,7,8,9 完整呈現,未丟失 B~C 間資料。若忘記 B 點確切時間,可查閱 alert.log 搜尋 "change" 獲取 SCN,或在 V$DATABASE 查詢 RESETLOGS_CHANGE# - 1。本例中 B 點 SCN 為 690772,復原命令可寫為 RECOVER DATABASE UNTIL CHANGE 690773 USING BACKUP CONTROLFILE。