了解在 SQL Server 中還原和復原備份的運作方式

這個主題與所有的 SQL Server 資料庫相關。

「還原」是一種程序,先從備份複製資料,再將記錄的交易套用到此資料,以使其向前復原到目標復原點。資料或差異備份包含充足的交易記錄,以便能夠在還原每個備份的過程中,向前復原使用中交易。每個備份也包含充足的記錄,以便回復未認可的交易,讓資料庫返回在交易上一致且可用的狀態。向前復原未認可交易 (如果有的話) 並讓資料庫連線的處理序稱為「復原」。

向前復原集

將已記錄變更套用至資料庫中的資料,以便讓資料向前復原的處理序就稱為「向前復原」。所有已還原的資料集稱為「向前復原集」。向前復原集是由還原一或多個完整備份 (例如資料庫或部分備份,或檔案備份組) 所定義。如果 RESTORE 陳述式指定了檔案群組、檔案或頁面,則向前復原集內只會包含這些項目。否則,向前復原集內將會包含所要還原之備份中的所有檔案。如果完整備份包含記錄,則會使用這個記錄向前復原已還原的資料。

[!附註]

如果在還原期間指定檔案群組,還原就會根據現況包含整個檔案群組。這包括自從備份後加入至檔案群組的任何檔案。如需詳細資訊,請參閱<控制向前復原期間加入檔案的建立>。

若為差異備份,如果自差異基底後將任何檔案加入資料庫中,則還原差異備份可能會以差異備份的資料來覆寫向前復原集中的頁面。如需詳細資訊,請參閱<使用差異備份>。

只有在頁面存在於向前復原集、頁面包含在備份中,而且 RESTORE 陳述式有列出該頁面或其檔案,或完全沒有列出任何檔案或頁面時,還原差異備份才會更新頁面。

在完整與大量記錄復原模式下,必須個別備份記錄檔。還原資料備份及 (選擇性) 差異備份之後,您通常會還原後續的記錄備份,以將資料庫復原到失敗點。還原記錄備份會將向前復原集內的所有頁面向前復原。如需有關記錄備份的詳細資訊,請參閱<使用交易記錄備份>。

還原順序

每一種還原實例都是使用一或多個還原步驟 (作業) (稱為「還原順序」) 來實作。每個作業會對應至個別的 Transact-SQL RESTORE 陳述式。還原順序會透過一或多個還原階段來移動受影響的資料。

如需有關 Transact-SQL 還原順序及如何建構它們的詳細資訊,請參閱<使用 SQL Server 資料庫的還原順序>。

還原階段

還原是一套多階段的程序。可能的還原階段包括資料複製、重做 (向前復原) 及恢復 (回復) 階段:

  • 資料複製階段包括將資料庫備份媒體中的所有資料、記錄檔及索引頁複製到資料庫檔案。

  • 重做階段會將所記錄的交易套用到從備份複製而來的資料,以將該資料向前復原到復原點。此時,資料庫通常會有未認可的交易,並且處於不可用狀態。這種情況下,復原資料庫的過程中就需要恢復階段。

  • 恢復階段 (這是復原的第一個部分) 會回復任何未認可的交易,並讓使用者使用該資料庫。回復階段之後,便無法還原後續的備份。

此章節的剩餘部分將更仔細地帶您檢視這些階段。

資料複製階段

所有還原程序的第一個階段都是「資料複製階段」。資料複製階段會初始化所要還原的資料庫、檔案或頁面的內容。使用完整或差異備份的資料庫、檔案及分頁還原作業會執行這個階段。

資料複製階段需要從一或多個完整備份 (或者再另外從差異備份) 複製資料,然後將受影響資料庫、檔案或頁面的內容重設到那些備份擷取這些內容的時間點。

向前復原集內最舊的檔案或頁面決定了下一階段的起點:重做 (向前復原)。

重做階段 (向前復原)

「重做」 (或「向前復原」) 是一套程序,用來對向前復原集內的資料重做所記錄的變更,以將資料向前帶往較新的時間。為了完成向前復原,SQL Server Database Engine 會在還原記錄備份時,從完整備份中包含的記錄開始進行處理。

還原會避免不必要的向前復原。通常,如果資料在備份時是唯讀,而且仍然維持唯讀,此時便不需要向前復原,而會略過向前復原。

復原點

向前復原的目標是要將資料還原為其在復原點的原始狀態。「復原點」是使用者指定要資料集復原到的那一點。在完整復原模式下,您可以將復原點指定成特定時間點、標示的交易或記錄序號。在大量記錄復原模式下,只有當上一次記錄備份以來尚未進行大量作業時,您才能還原至某個時間點。

重做一致性

在重做階段中,資料永遠會向前復原到與復原點之資料庫狀態一致 (「重做一致」) 的那一點。所有資料都已經向前復原到可能發生恢復動作的那一點。

資料庫的狀態是由主要檔案來定義,如下所示:

  • 如果要還原的是主要檔案,則復原點將決定整個資料庫的狀態。例如,如果資料庫剛好復原到資料表意外遭到卸除前的時間點,則整個資料庫都必須還原到相同的時間點。

  • 如果要還原的不是主要檔案,則資料庫狀態為已知,此時還原的資料會向前復原到在交易上與資料庫一致的復原點。SQL Server 會強制做這樣的處理。

不過,資料庫可能會包含在復原點未認可的交易所做的變更。至於線上還原,資料會復原到與資料庫線上部分的目前狀態一致的時間點。

差異備份會一直向前略過,直到抵達先前取得該差異備份的時間。向前復原集內的頁面,會以差異備份中的任何最新頁面覆寫。

恢復 (回復) 階段與復原

在重做階段向前復原所有記錄交易之後,資料庫通常會包含復原點上未認可交易所做的變更。這使得向前復原資料在交易上不一致。復原程序會開啟交易記錄以識別未認可交易。未認可交易將藉由回復而恢復,除非這些交易持有防止其他交易檢視交易不一致之資料的鎖定。這個步驟即稱為「恢復」 (或「回復」) 階段。如果資料在復原程序開始時已經是交易一致的,便會略過恢復階段。資料庫在交易上一致之後,復原會使資料庫回到線上。

在還原了一或多個備份之後,復原通常會將重做及恢復階段都納入。每個完整和差異備份都包含充分的交易記錄檔記錄,足以讓該備份中的資料復原到自我一致的狀態。

[!附註]

在損毀復原或資料庫鏡像容錯移轉期間,SQL Server 2005 Enterprise Edition 及更新的版本可讓使用者在恢復階段存取資料庫。這稱為「快速復原」。因為發生損毀時未認可的交易會重新取得它們在損毀之前所持有的任何鎖定,所以快速復原是可行的。回復這些交易時,它們的鎖定會保護它們,不受到使用者的干擾。

RECOVERY 及 NORECOVERY 選項與還原階段的關係

特定的 RESTORE 陳述式會在重做階段之後結束,或繼續完成恢復階段,視陳述式是否指定 WITH NORECOVERY 而定,如下所述:

  • WITH RECOVERY 同時包括重做和恢復階段,並復原資料庫;但無法還原額外的備份。這是預設值。

    如果向前復原集並未向前復原至與資料庫一致的位置,則不會發生恢復階段。Database Engine 會發出錯誤,並停止復原。

    如果整個向前復原集與資料庫一致,則會執行復原,並使資料庫回到線上。

  • WITH NORECOVERY 會省略恢復階段,以保留未認可的交易。省略恢復階段可還原其他備份,讓資料庫向前復原到更遠的時間點。有時,RESTORE WITH NORECOVERY 會將資料向前復原至與資料庫一致的位置。在這些情況下,Database Engine 會發出參考用訊息,說明此時可以使用 RECOVERY 選項來復原向前復原集。

    如需有關向前復原集的詳細資訊,請參閱<了解在 SQL Server 中還原和復原備份的運作方式>。

[!附註]

第三個替代方案是 WITH STANDBY,但它不在本主題的討論範圍。

如需這些 RESTORE 選項的深入描述,請參閱<RESTORE (Transact-SQL)>。

復原路徑

「復原路徑」是一組唯一的轉換,它會隨資料庫一起演進,但仍維護其一致性。如需有關復原路徑的詳細資訊及復原分岔與復原分支的相關概念,請參閱<復原路徑>。