Sql-Server

SQL Server 中的實例恢復?

  • April 11, 2017

當 SQL Server 發生意外災難導致實例崩潰時,SQL Server 如何恢復數據庫?

SQL Server 經歷了哪些階段來恢復數據,SQL Server 在實例恢復中執行了哪些步驟?

實例恢復階段

恢復的可能階段包括數據複製、重做(前滾)和撤消(回滾)階段:

數據複製階段

  • 任何恢復過程的第一個階段是數據複製階段。數據複製階段初始化正在恢復的數據庫、文件或頁面的內容。
  • 此階段由使用完整或差異備份的還原數據庫、還原文件和還原頁面操作執行。
  • 數據複製階段包括從一個或多個完整備份以及可選的差異備份複製數據,然後將受影響的數據庫、文件或頁面的內容重置為這些備份擷取它們的時間。
  • 前滾集中最舊的文件或頁面確定下一階段的起點:重做(前滾)。

重做階段(前滾)

  • 重做(或前滾)是重做前滾集中數據的記錄更改以及時將數據前移的過程。
  • 為了完成前滾,SQL Server 數據庫引擎在還原日誌備份時處理它們,從包含在完整備份中的日誌開始,還原避免了不必要的前滾。
  • 通常,如果數據在備份時是只讀的並且一直保持只讀,則前滾是不必要的並且會被跳過。

恢復點

前滾的目標是在恢復點將數據返回到其原始狀態。恢復點是使用者指定恢復數據集的點。在完全恢復模式下,您可以將恢復點指定為特定時間點、標記的事務或日誌序列號。在大容量日誌恢復模式下,只有在上次日誌備份後沒有執行大容量操作時,您才能恢復到某個時間點。

重做一致性 在重做階段,數據總是前滾到與恢復點的數據庫狀態重做一致的點。所有數據都已前滾到可以撤消的點。

數據庫的狀態由主文件定義,如下:

  • 如果正在恢復主文件,則恢復點將確定整個數據庫的狀態。例如,如果將數據庫恢復到表被意外刪除之前的某個時間點,則必須將整個數據庫恢復到同一時間點。
  • 如果未恢復主文件,則數據庫狀態是已知的,並且恢復的數據將前滾到與數據庫在事務上一致的恢復點。SQL Server 強制執行此操作。

但是,數據庫可能包含在恢復點未送出的事務所做的更改。對於聯機恢復,數據恢復到與數據庫聯機部分的目前狀態一致的時間點。

差異備份會向前跳到進行差異備份的時間。前滾集中的頁面會被差異備份中任何更新的頁面覆蓋。

撤消(回滾)階段和恢復

  • 在重做階段前滾所有日誌事務之後,數據庫通常包含由在恢復點未送出的事務所做的更改。這使得前滾數據在事務上不一致。
  • 恢復過程打開事務日誌以辨識未送出的事務。未送出的事務通過回滾來撤消,除非它們持有阻止其他事務查看事務不一致數據的鎖。此步驟稱為撤消(或回滾)階段。
  • 如果數據在恢復過程開始時已經在事務上保持一致,則跳過撤消階段。數據庫事務一致後,恢復使數據庫聯機。

恢復一個或多個備份後,恢復通常包括重做和撤消階段。每個完整備份和差異備份都包含足夠的事務日誌記錄,以允許將該備份中的數據恢復到自洽狀態。

有關更多資訊,請查看下面提到的連結:

https://technet.microsoft.com/en-us/library/ms191455(v=sql.105).aspx

除了上述答案;我還想添加一些我在對其進行研究時遇到的更詳細的資訊:

SQL Server 在執行實例恢復時執行的步驟如下:

實例恢復旨在:

  • 將所有已送出的更改寫入數據文件
  • 撤消數據文件中所有未送出的更改
  • 增加檢查點編號。到已將更改寫入數據文件的 LSN。

在實例崩潰之前:

  • 一些已送出的更改在日誌文件中,但尚未寫入數據文件
  • 一些未送出的更改已進入數據文件
  • 一些未送出的更改在日誌緩衝區/記憶體中

實例崩潰後:

  • 清除日誌緩衝區/記憶體中所有未送出的更改
  • 讀取日誌文件以辨識需要恢復的頁面
  • 從數據文件中讀取已辨識的頁面
  • 在前滾階段,重做日誌文件中的所有更改(已送出/未送出)都將應用於它們
  • 在回滾階段,所有未送出的更改都會回滾
  • 檢查點的 LSN 在數據文件/日誌文件標頭中更新。

(從https://stackoverflow.com/questions/2391399/three-phases-of-recovery-the-analysis-phase-the-redo-phase-and-finally-the-u複製)

您可能會發現此文件很有趣:SQL Server 恢復過程的簡單概述

恢復階段

恢復算法有 3 個階段,基於事務日誌中的最後一個檢查點。

第一階段:分析。從事務日誌中的最後一個檢查點開始。此過程確定並構造一個臟頁表 (DPT),其中包含在 SQL Server 停止時可能是臟頁的頁面。活動事務表是由 SQL Server 停止時未送出的事務建構的。

第 2 階段:重做。此階段將數據庫返回到 SQL 服務停止時的狀態。此前向傳遞的起點是最舊的未送出事務。DPT 中的最小日誌序列名稱(每個日誌記錄都標有 LSN)是 SQL Server 第一次希望必須重做頁面上的操作,重做已記錄的操作從最舊的打開事務開始,以便可以獲取必要的鎖。

階段 3:撤消:此處將在階段 1 中辨識的活動事務列表(在 SQL Server 停止時未送出)單獨回滾。SQL Server 跟踪每個事務的事務日誌中條目之間的連結。在 SQL Server 停止時未送出的任何事務都將撤消。

恢復數據庫時可以進行恢復,但也可以在數據庫啟動時進行(崩潰恢復)。

引用自:https://dba.stackexchange.com/questions/165169