復原路徑
如果使用差異或記錄備份,而且透過下列兩種方法之一,將資料庫復原至先前的時間點,瞭解復原路徑就很重要:
- 執行時間點還原
- 不先還原所有記錄備份或大部分最近的差異備份,就執行復原。
如果將資料庫復原到較早的復原點,並且從該復原點開始使用資料庫,則會產生新的復原路徑。*「復原路徑」*是資料與記錄備份的順序,以一般資料庫使用方式或特定的資料與記錄還原方式,將資料庫帶回到特定的時間點。復原路徑包含唯一的一組特定轉換,使資料庫隨時間而變化,同時又能維護資料庫的一致性。下圖說明復原點與所產生復原路徑之間的關係。
一般而言,復原點會開始新的復原路徑,因為交易必須回復,且資料庫目前處於唯一狀態。預先存在的備份現在可能有大於此復原點之 LSN 的記錄順序編號 (LSN)。這些備份中的 LSN 存在於不同的復原分支上,來自目前復原作業所建立的新分支。
附註: |
---|
若還原完整資料庫備份並復原資料庫,但不使用其他任何類型的備份,則會產生新的復原路徑。 |
最佳作法:若要避免產生有多個復原分岔的復原路徑,請在復原資料庫之後,儘快執行一組完整的資料備份。這種作法保證所有備份都是取自單一復原分支。若要確認,可以查看 backupset 資料表或 RESTORE HEADERONLY 結果集中的 last_recovery_fork_guid 資料行。
下列情況會產生新的復原路徑,因為資料庫未還原至「結束時間」。之後,有備份存在,可以帶領資料庫循兩個或多個復原路徑還原,全部都使用相同範圍的 LSN。
- 還原完整資料庫備份與差異資料庫備份並復原資料庫,而不套用現有的交易記錄備份。
- 將資料庫復原到某個差異備份的結尾,而不是最近一次的差異備份。
- 將資料庫復原到某個交易記錄備份的結尾,而不是最近一次的交易記錄備份。
- 將資料庫復原到交易記錄備份中特定的時間或標示的交易。
復原路徑的範例
下圖說明資料庫進行復原時,新復原路徑的分支情形。在此圖中,會建立一個完整資料庫備份和一連串四個記錄備份。然後,還原完整資料庫備份、「記錄備份 1」與「記錄備份 2」會將資料庫還原到「記錄備份 2」的結尾。資料庫還原到此點,並產生新的復原路徑。接著再使用資料庫一段時間,並且建立「記錄備份 5」及「記錄備份 6」另外兩個交易記錄備份。
資料庫備份和前四個記錄備份都在分支 1 上,「記錄備份 5」和「記錄備份 6」則都在分支 2 上。復原分岔包含「記錄備份 2」的最後一個 LSN (Log_Backup_2.LastLSN),和「記錄備份 5」的第一個 LSN (Log_Backup_5.FirstLSN)。
在「記錄備份 5」之內,first_recovery_fork_guid 識別分支 1,而 last_recovery_fork_guid 識別分支 2。復原路徑是分支 1、分支 2。
附註: |
---|
分岔到新的路徑不需要還原到記錄備份的結尾。 |
還原並沿著舊路徑向前復原
我們建議您避免使用舊的復原路徑。這是因為使用舊的復原路徑會造成資料庫在兩個不同的時間間隔認可交易。但是必要時,您可以遵循建立目前復原路徑之前所採取的備份順序,沿舊的復原路徑向前復原。例如,您可以使用時間點復原之前的備份沿著舊路徑到達復原點。
附註: |
---|
若要從共同的父系建立兩個資料庫,對於每個資料庫,請考慮一個必須用來達到資料庫結束時間的復原路徑。 |
例如,根據先前圖表中建立的備份,在建立「記錄備份 5」和「記錄備份 6」之後,仍然可以還原至「記錄備份 3」的結尾,那是在舊復原路徑上。
還原並從舊路徑向前復原到新路徑
SQL Server Database Engine 會避免讓單一還原順序使用不是同時產生的備份 (亦即,嘗試沿著不同的復原路徑向前復原)。此限制可以讓資料庫在復原之後維持一致性。
若要還原並沿著新的復原路徑向前復原,請為復原點之前的備份與復原點之後的備份建構不同的還原順序:
- 還原取自導入新復原路徑之復原以前的備份。排除包含復原點的備份。
- 還原取自復原路徑建立以來的備份,沿著新復原路徑向前復原。
例如,根據在先前圖示中建立的備份,假設「記錄備份 3」涵蓋上午 10 點到 11 點之間的時間,則已執行指定 STOPAT**=10:**30 的時間點復原。因此產生復原路徑分岔,並開始新的復原分支。分支 2。新分支上的第一個記錄備份「記錄備份 5」,包含與「記錄備份 3」相同的第一個 LSN,取代了現在已經無用的「記錄備份 3」。若要還原新復原路徑上的備份 (從分支 1 開始而在分支 2 結束),還原順序是:完整資料庫備份,「記錄備份 1」,「記錄備份 2」,「記錄備份 5」,以及「記錄備份 6」。
管理復原分岔
復原分支是共用相同 GUID 之 LSN 的範圍。復原路徑描述從起點 (LSN,GUID) 到終點 (LSN,GUID) 的 LSN 範圍。復原路徑中的 LSN 範圍從開始到結束可能會跨越一或多個復原分支。當資料庫建立時以及當 RESTORE WITH RECOVERY 產生復原分岔時,就會產生新的復原分支。
復原分岔是每次執行 RESTORE WITH RECOVERY 時,新的復原分支的起始點 (LSN,GUID)。每一個復原分岔決定復原分支之間的父子關聯性。
復原資料庫會將整個資料庫的狀態 (包括下一個 LSN) 設定到復原點。然後 LSN 會從 fork_point_lsn 開始重複使用。所以建構還原順序時,備份必須與復原分岔以及 LSN 連結,因為可能會有一個以上的分岔有相同的 LSN。下圖說明 LSN 重新使用情形。示範如何在不同的復原分岔中重複使用 LSN
如果還原順序必須納入跨越復原分岔的備份,就必須建構還原順序,以便使用的備份依照正確的復原路徑回到復原點。因此備份要包括 backupset.first_recovery_fork_guid 和 backupset.last_recovery_fork_guid。這些是用來連結備份,確保順序會按照正確的分岔。
backupset 歷程記錄資料表中的值可讓您判斷要使用哪一組備份:
- 對於要還原之順序中的每個記錄備份,first_recovery_fork_guid 必須與順序中先前備份的 last_recovery_fork_guid 相等。
- 也必須連結資料和差異備份。
若記錄備份同時包含完整資料庫備份或差異資料庫備份的最後一個 LSN 以及分岔點,連結測試會視與分岔點相關的最後一個 LSN 位置而定。
使用 backupset 值的連結測試如下:- 若 last_lsn 小於或等於 fork_point_lsn,則資料或差異備份的 last_recovery_fork_guid 必須等於記錄備份的 first_recovery_fork_guid。下圖說明 last_lsn 小於 fork_point_lsn 的狀況。
- 若 last_lsn 大於 fork_point_lsn,則資料或差異備份的 last_recovery_fork_guid 必須等於記錄備份的 last_recovery_fork_guid。下圖說明 last_lsn 大於 fork_point_lsn 的狀況。
- 若 last_lsn 小於或等於 fork_point_lsn,則資料或差異備份的 last_recovery_fork_guid 必須等於記錄備份的 first_recovery_fork_guid。下圖說明 last_lsn 小於 fork_point_lsn 的狀況。
- 對於差異備份,請使用 backupset.differential_base_guid 找出差異基底。
如果差異備份有多個基底,backupset.differential_base_guid 是 NULL,則您必須使用 backupfile.differential_base_guid,每個檔案逐一判斷差異基底。
請參閱
概念
使用備份與還原來複製資料庫
規劃和執行還原順序 (完整復原模式)
記錄序號簡介
記錄序號和還原計劃
差異備份的基底