共用方式為


SQL Server 備份應用程式 - 磁碟區陰影複製服務 (VSS) 和 SQL 寫入器

適用於:SQL Server - 僅限 Windows

SQL Server 會藉由提供寫入器 (SQL 寫入器) 來支援磁碟區陰影複製服務 (VSS),讓協力廠商備份應用程式可以使用 VSS 架構來備份資料庫檔案。 本文件描述 SQL 寫入器元件及其在 SQL Server 資料庫的 VSS 快照集建立和還原程序中所扮演角色。 其中也會詳細說明如何設定及使用 SQL 寫入器,以搭配 VSS 架構中的備份應用程式運作。

VSS 的基礎結構

VSS 提供在 Windows 系統上執行 VSS 應用程式的系統基礎結構。 雖然 VSS 對使用者和開發人員來說大部分是透明的但:

  • 在建立和使用陰影複製時,協調提供者、寫入器和要求者的活動。
  • 提供預設的系統供應者。
  • 實作任何提供者運作所需的低階驅動程式功能。

VSS 服務會視需要啟動,因此必須啟用此服務,才能讓 VSS 作業成功。

VSS 元件

VSS 會協調下列合作元件的活動:

  • 提供者會擁有陰影複製資料並具現化陰影複製。

  • 寫入器是變更資料並參與陰影複製同步處理程序的應用程式。

  • 要求者會起始陰影複製的建立和解構。 此設計著重於要求者是備份應用程式的案例。

VSS 提供下列各方之間的協調:

此圖顯示 VSS 如何提供合作對象之間的協調。

此圖表顯示參與一般 VSS 快照集活動的所有元件。 在此案例中,SQL Server (包括 SQL 寫入器) 會作為寫入器方塊中的其中一個寫入器。 其他此類寫入器的例子可能包括 Exchange Server 等。

  • 虛擬設備介面:SQL Server 提供稱為虛擬設備介面 (VDI) 的應用程式程式設計介面,可藉由提供備份和還原作業的支持,協助獨立軟體廠商將 SQL Server 整合到其產品中。 這些 API 可提供最高的可靠性與效能,並能支援所有的 SQL Server 備份和還原功能,包括所有熱備份與快照集備份能力。 如需詳細資訊,請參閱 SQL Server 2005 虛擬備份裝置介面規格 (英文)。

  • 要求者:要求為一或多個原始磁碟區建立一或多個快照集的程序 (自動或 GUI)。 在本文中,要求者也會用來表示正在建立 SQL Server 資料庫的快照集的備份應用程式。

如需詳細資訊,請參閱 磁碟區陰影複製服務

SQL 編寫者

SQL 寫入器是 SQL Server 實例所提供的 VSS 寫入器。 其處理與 SQL Server 的 VSS 互動。 SQL 寫入器是以獨立服務形式隨附於 SQL Server,並在 SQL Server 安裝過程中一併安裝。

SQL 寫入器在 VSS 快照集備份作業中的角色:

VSS 快照集的螢幕快照。

設定 SQL 寫入器

SQL 寫入器服務會在 SQL Server 安裝過程中一併安裝於系統,並設定為在 Windows 啟動時自動啟動。

SQL 寫入器服務帳戶

在安裝過程中,SQL 寫入器帳戶會設定為使用本機系統帳戶。 由於 SQL 寫入器需要使用專屬的 VDI API 來與 SQL Server 通訊,因此 SQL 寫入器帳戶必須具有足夠的 SQL Server 和 VSS 存取權限。 將此服務設定為本機系統帳戶會提供足夠的權限,讓服務正常執行。

這很重要

請確定 SQL 寫入器服務會在本機系統帳戶下執行,而且 SQL Server NT SERVICE\SQLWriter 帳戶是 系統管理員 角色的成員。

重新啟用並啟動 SQL 寫入器

根據預設,SQL 寫入器服務會啟用並自動啟動。 如果已修改此組態,則必須採取下列步驟,才能還原為預設設定:

SQL 寫入器服務可以藉由將此服務標示為 [自動] 來啟用。 若要透過控制面板開啟服務,請選取 [ 啟動],選取 [ 控制面板],按兩下 [系統管理工具],然後按兩下 [ 服務]。 在 [ 服務 ] 窗格中,按兩下 SQL 寫入器 服務,並將 [啟動類型 ] 屬性修改為 [自動]。

然後,應該選取先前提及之服務屬性畫面中 [服務狀態] 屬性下的 [開始] 按鈕來啟動服務。

注意

在某些情況下,如果已安裝 SQL Server Express 的實例,並且應用程式正在使用「用戶實例」功能,SQL 寫入者可能會由 SQL Server 自動啟動。 這麼做是為了在 VSS 備份作業期間,協助列舉這些使用者執行個體。

SQL 寫入器支援的功能

  • 全文檢索:SQL 寫入器會在寫入器元數據檔中的資料庫元件下,報告具有遞歸檔案規格的全文檢索目錄容器。 選取資料庫元件時,它們會自動包含在備份中。

  • 差異備份和還原:SQL 寫入器支援透過兩種 VSS 差異機制進行差異備份和還原:

    • 部分檔案:SQL 寫入器會使用 VSS 部分檔案機制來報告其資料庫檔案中變更的位元組範圍。

    • 依上次修改時間的差異檔案:SQL 寫入器會使用 VSS 差異檔案依上次修改時間機制來報告全文檢索目錄中變更的檔案。

  • 使用行動進行還原:SQL 寫入器在還原期間支援 VSS 的新目標規格。 新的目標規格可讓資料庫/記錄檔或全文檢索目錄容器重新定位為還原作業的一部分。

  • 資料庫重新命名:要求者可能需要以新名稱還原 SQL Server 資料庫,特別是當資料庫與原始資料庫並存還原時。 只要資料庫保留在原始 SQL 執行個體中,SQL 寫入器就支援在還原作業期間重新命名資料庫。

  • 僅限複製備份:有時需要進行適用於特殊用途的備份,例如,當您需要建立資料庫複本以供測試之用時。 此備份不應影響資料庫的整體備份和還原程式。 COPY_ONLY使用 選項會指定備份是在頻外完成,而且不應該影響一般備份順序。 SQL 寫入器支援 SQL Server 執行個體的僅限複製的備份類型。

  • 資料庫快照集的自動復原:通常是使用 VSS 架構取得之 SQL Server 資料庫的快照集處於非復原狀態。 無法安全地存取快照集中的數據,然後才進行復原階段,以復原進行中的交易,並將資料庫置於一致狀態。 VSS 備份應用程式可以要求快照集的自動復原,做為快照集建立程式的一部分。

本文的備份和還原選項詳細中更詳細地說明了這些新功能及其使用方式。

不支援的內容

  • SQL 寫入器不支援記錄備份。
  • 不支援檔案和檔案群組備份。
  • 不支援頁面還原。
  • 不支援資料庫快照集,且在建立元件和非元件 VSS 快照集時會將其忽略。
  • 自動關閉的資料庫或關閉功能已啟用的資料庫。
  • Linux 不提供 VSS 架構,因此 Linux 上無法使用 SQL 寫入器。

下表列出 SQL 寫入器/SQL Server 針對 Windows 上所有 SQL Server 版本使用 VSS 架構所支援的快照集備份類型。

備份和還原作業 以元件為基礎 非元件型
完整資料備份
(包括全文檢索目錄)
Yes Yes
完整還原 Yes Yes
完整還原 (沒有復原) Yes
差異備份 Yes
差異還原 Yes
使用移動還原 Yes
資料庫重新命名 Yes
僅複製備份 Yes
自動恢復的快照 Yes
日誌備份
資料庫快照集
自動關閉資料庫
關閉的資料庫
Yes
可用性群組資料庫 Yes 次要選項為否定

備份作業

SQL Server (使用 SQL 寫入器) 支援下列以 VSS 為基礎的備份作業模式:

  • 非組件式
  • 以元件為基礎

版本支援

SQL 寫入器隨附於 SQL Server,且僅支援 SQL Server 執行個體。 SQL 寫入器也會列舉 SQL Server Express 實例,包括 SQL Server Express 版本啟動的用戶實例。

非元件型備份作業

非元件型備份會使用快照集中的磁碟區清單,以隱含方式選取資料庫。 SQL 寫入器會檢查是否有損毀資料庫,並在找到時引發錯誤。 撕裂的資料庫是指在磁碟區清單中選取文件子集的資料庫。

在非元件型模型中,僅支援具有簡單恢復模式的資料庫。 不支援還原操作後的滾動前移。

元件型備份作業

建議搭配 SQL 寫入器使用元件型備份,因為應用程式 (VSS 備份應用程式) 會從 SQL 寫入器傳回的元數據中明確選取資料庫。 快照集應該包含備份這些資料庫所需的所有磁碟區。 VSS 基礎結構不會自動新增所選資料庫集所需的磁碟區。 所有備份磁碟區都應該包含在磁碟區快照集中。 備份應用程式有責任確保所有後備磁碟區都包括在快照集中。 SQL 寫入器會偵測損毀的資料庫(在快照集外部備份磁碟區),並失敗備份。

本節的其餘部分假設元件型備份是 SQL Server VSS 快照集建立程式的一部分。

快照建立過程

VSS 架構會在建立 SQL Server 快照集期間協調 要求者 (備份應用程式)和 SQL 寫入器的活動。 為了啟用此協調,VSS 架構會定義要求者和寫入器 介面。 參與的請求者應用程式和寫作工具都應該實作這些介面。 SQL 寫入器會實作必要的寫入器介面。 在快照集建立過程中,VSS 架構會呼叫 SQL 寫入器的介面。 SQL 寫入器會與系統上的 SQL Server 執行個體互動,以協助建立快照集。

VSS 架構會定義一組可供要求者/備份應用程式使用的 API。 備份應用程式開發人員必須遵循這些 API 呼叫模式,以便配合 VSS 架構的快照建立過程。 下一節將從 SQL 寫入器的觀點來描述快照集建立程序。 其中也會詳細說明要求者、VSS 架構、SQL 寫入器和 SQL Server 執行個體之間的一些內部互動。

如需這些步驟的詳細資訊,以及 VSS 架構介面的詳細資訊,請參閱 磁碟區陰影複製服務 (VSS)

注意

假設您已熟悉 VSS 架構和備份建立程式。 這些章節可作為補充資訊,說明 SQL 寫入器如何參與 VSS 備份建立程序。

快照建立工作流程

下圖顯示元件型快照集建立/備份作業期間的數據流圖表。

數據流的螢幕快照。

若要更充分了解執行備份所涉及的基本工作,將這個概觀細分為下列階段很有用:

備份初始化

在備份的這個階段中,要求者(備份應用程式)會系結至快照集介面 IvssBackupComponents,並初始化它以準備備份。 它也會呼叫 VSS API IVssGatherWriterMetadata,以指示 VSS 架構從所有寫入器收集中繼資料。

VSS 架構會使用 OnIdentify 事件,針對寫入器元數據呼叫每個已註冊的寫入器,包括 SQL 寫入器。 SQL 寫入器會查詢 SQL Server 實例,以取得每個資料庫的備份元數據資訊,並建立寫入器元數據檔。 這個階段也稱為 元數據列舉

寫入器元數據檔是一份檔,其中包含從寫入器傳遞至要求者(備份應用程式)的資訊。 寫入器元資料檔包含下列資訊:

  • 應用程式識別碼和易記名稱
  • 檔案和元件存在的位置
  • 備份中必須包含和排除哪些檔案
  • 在還原時應該使用哪些選項

這會透過 VSS 架構傳回給要求者。

備份檢測

在這個階段中,要求者會檢查撰寫者元數據文件,並建立並填寫備份元件文件,其中包含需要備份的每個元件。 它也會指定所需備份選項和參數來作為此文件的一部分。 針對 SQL 寫入器,每個需要備份的資料庫執行個體都是個別元件。

備份元件文件

這是要求者在設定還原或備份作業的過程中所建立的 XML 文件 (使用 IVssBackupComponents 介面)。 備份元件文件包含一份明確納入的元件清單,這些元件來自一個或多個撰寫者,並參與備份或還原作業。 它不包含隱含的元件資訊。 相反地,寫入器元數據檔只包含可能參與備份的寫入器元件。 如需備份元件文件的結構詳細資料描述,請參閱 VSS API 文件。

備份前工作

VSS 下的備份前工作著重於建立包含備份資料的磁碟區陰影複製。 備份應用程式會從卷影複製中保存數據,而不是從實際磁碟區保存數據。

在準備備份和建立陰影複本時,請求者通常會等待負責寫入的程式。 如果 SQL 寫入器參與備份作業,則必須設定其檔案及本身以準備備份和陰影複製。

準備備份

要求者必須設定需要執行的備份作業類型(IVssBackupComponents::SetBackupState),然後透過 VSS 通知寫入器,以使用 IVssBackupComponents::PrepareForBackup準備備份作業。

SQL 寫入器可存取備份元件檔,其中詳細說明需要備份的資料庫。 所有備份磁碟區都應該包含在磁碟區快照集中。 SQL 寫入器會偵測損毀的資料庫(在快照集外部備份磁碟區),並在 PostSnapshot 事件期間失敗備份。

實際檔案備份

在此階段中,要求者可以視需要將資料移至備份媒體。 此階段中的互動是在要求者與 VSS 架構之間進行。 未涉及 SQL 寫入器。

  1. 取得作家身份。 傳回寫入器的狀態。 申請者可能需要在此處處理任何故障。
  2. 執行備份。

此時,要求者可以視需要將資料移至備份媒體。

備份完成

此事件表示備份已順利完成。

如果目前的備份是資料庫的完整備份(而不是僅限複製備份),SQL 寫入器也可以在此時將備份提交為差異基底。

注意

要求者應該明確地傳送此事件 (「備份完成」事件),以允許 SQL 寫入器認可差異基底備份。 如果未收到此事件,則所建立的備份不是合格的差異基礎備份。

儲存寫入器中繼資料

要求者應儲存備份元件文件和每個元件備份的元數據,以及從快照備份的數據。 SQL 寫入器/SQL Server 需要這些寫入器中繼資料,才能進行還原作業。

備份終止

要求者會藉由釋放 IVssBackupComponents 介面或呼叫 IVssBackupComponents::DeleteSnapshots來終止陰影複製。

SQL 編寫器元數據文件

這是寫入器 (在此案例中為 SQL 寫入器) 使用 IVssCreateWriterMetadata 介面所建立的 XML 文件,其中會包含寫入器狀態和元件的資訊。 VSS API 文件中描述了寫入器元數據檔案的結構化詳細資料。 以下是 SQL 寫入器元數據檔的一些詳細數據。

  • 寫入器識別資訊

    • 寫入器名稱 - L"SqlServerWriter"
    • 寫入器類別識別碼 - 0xa65faa63、0x5ea8、0x4ebc、0x9d、0xbd、0xa0、0xc4、0xdb、0x26、0x91、0x2a
    • 寫入器執行個體識別碼 - L"SQL Server:SQLWriter"
    • VSSUsageType - VSS_UT_USERDATA
    • VSSSourceType - VSS_ST_TRANSACTEDDB
  • 寫入器層級資訊 - VSS_APP_BACK_END

  • 還原方法規格 - VSS_RME_RESTORE_IF_CAN_REPLACE。

  • 支持的備份架構 (IVssCreateWriterMetadata::SetBackupSchema API)

    • VSS_BS_DIFFERENTIAL - 差異備份
    • VSS_BS_TIMESTAMPED - 以時間戳記為基底 - 適用於全文檢索目錄檔案。
    • VSS_BS_LAST_MODIFY - 根據上次修改時間的差異備份。
    • VSS_BS_WRITER_SUPPORTS_NEW_TARGET - 支援新目標位置選項。
    • VSS_BS_WRITER_SUPPORTS_RESTORE_WITH_MOVE - 支援「以移動的方式」還原
    • VSS_BS_COPY - 支援「僅限複製」備份選項。
  • 元件層級資訊(包含 SQL 寫入器所提供的元件層級特定資訊)

    • 類型 - VSS_CT_FILEGROUP
    • 名稱 - 元件的名稱 (資料庫名稱)
    • 邏輯路徑 – 伺服器實例的形式(以具名實例的 “server\instance-name” 形式,默認實例為 “server”。
    • 元件旗標
    • VSS_CF_APP_ROLLBACK_RECOVERY - 表示 SQL Server 快照集一律需要「復原」階段,才能讓檔案一致並可用於非備份 (也就是應用程式回復) 案例。
    • 可選擇 - 是
    • SelectableForRestore - True
    • 支援的還原方法 - VSS_RME_RESTORE_IF_CAN_REPLACE

SQL Server 中元件集結構的唯一延伸模組是引進全文檢索目錄。 全文檢索目錄是容器目錄,無法表示為 VSS 資料庫或記錄檔,因為 VSS 資料庫和記錄檔沒有遞歸規格。 因此,SQL 寫入器會使用 VSS 檔案群元件 (VSS_CT_FILEGROUP) 來代表資料庫層級元件和檔案群組檔案,來代表資料庫、記錄檔和全文檢索目錄檔案。

本檔結尾會提供範例寫入器元數據檔。

啟動快照

要求者會呼叫 VSS 架構介面 DoSnapshotSet來起始快照集進程。

建立快照

這個階段牽涉到 VSS 架構與 SQL 寫入器之間的一系列互動。

  1. 準備快照 SQL 寫入器會呼叫 SQL Server 來準備建立快照集。

  2. 凍結。 SQL 寫入器會呼叫 SQL Server,以凍結快照中備份的每個資料庫的所有資料庫 I/O。 凍結事件回到 VSS 架構之後,VSS 會建立快照集。

  3. 解凍 在此事件中,SQL 寫入器會呼叫 SQL Server 實例,以 解除凍結 或繼續一般 I/O 作業。

快照集建立階段需要不到 60 秒的時間,以防止封鎖對資料庫的所有寫入。

快照後

如果快照集需要自動復原,SQL 寫入器會針對選取要位於快照集中的每個資料庫執行自動復原。 如需詳細說明,請參閱 自動復原快照

還原過程

本節描述還原作業工作流程及各個相關步驟。

還原作業工作流程

下圖顯示 VSS 還原作業期間的資料流程圖。

還原程式流程的螢幕快照。

若要更充分了解執行還原時所涉及的基本工作,請將此概觀細分為下列各節很有用:

在所有以元件為基礎的 VSS 還原案例中,SQL 寫入器會分兩個不同階段來處理資料庫還原。

  • 還原前:SQL 寫入器會處理驗證、關閉檔句柄等等。
  • 還原後:SQL 寫入器會附加資料庫,並視需要執行當機復原。

在這兩個階段之間,備份應用程式會負責在 SQL 底下四處移動相關資料。

還原初始化

在還原的初始化階段,要求者必須能夠存取儲存的備份元件檔。

備份作業期間產生的備份元件檔會儲存為備份數據的一部分。 備份應用程式必須將此資料傳回 VSS 架構。 SQL 寫入器會在還原程序一開始取得此資料的存取權。

準備還原

當要求者準備還原時,它會使用預存的備份元件文件來判斷要還原的內容和方式。 要求者會選取要還原的元件,並視需要設定適當的還原選項。

如果備份應用程式想要在目前的還原作業上套用差異或記錄備份(亦即需要使用 norecovery 進行還原 ),則應該針對要還原的每個資料庫,將下列選項設定為元件建立的一部分。

IVssBackupComponents::SetAdditionalRestores(true)

在備份元件檔中設定所有必要的詳細數據之後,要求者 IVssBackupComponents::PreRestore 會呼叫 ,透過寫入器處理的 VSS 產生預先還原事件。

SQL 寫入器會檢查提供的備份元件檔,以識別適當的資料庫,並刪除自備份時間以來所建立的任何其他檔案。 它也會檢查磁碟空間,並關閉任何開啟的資料庫檔案控制代碼,讓要求者可以在還原階段期間複製所需的資料。 此階段可在要求者執行實際檔案複製之前,及早偵測到任何錯誤狀況。 SQL Server 也會讓資料庫處於還原狀態。 從這一點開始,在成功還原之前,無法啟動資料庫。

還原檔案

這純粹是要求者特定的動作。 要求者(備份應用程式)有責任將所需的資料庫檔案(或將差異還原的相關數據範圍)複製到適當的位置。 SQL 寫入器未參與此作業。

清除和終止

一旦所有數據都還原到正確的位置,要求者的呼叫會通知還原作業已完成 IvssBackupComponents::PostRestore,可讓 SQL 寫入器知道可以啟動還原後動作。 此時的 SQL 寫入器會執行當機復原的 重做 階段。 如果未要求復原(亦即 SetAdditionalRestores(true) 不是由要求者指定),復原步驟的撤銷階段也會在此階段執行。

備份與還原選項詳細數據

本節詳細說明 SQL 寫入器支援的所有備份和還原選項。

要求者建立磁碟區陰影複製

SQL 寫入器可能會參與磁碟區陰影複製建立過程(不在備份和還原的範疇內),因為資料庫檔案的所屬備份磁碟區已被納入磁碟區快照集。 在此情況下,SQL 寫入器只會參與元數據列舉、 FreezeThawPrepareForSnapshotPostSnapshot 協調 (如需詳細數據,請參閱數據流圖)。

完整備份和還原

SQL 寫入器支援非元件型模式和元件型模式的完整備份和還原作業。

非元件型備份和還原

在非元件型備份和還原中,要求者會指定要備份和還原的磁碟區或資料夾樹狀結構。 這會備份與還原指定磁碟區和資料夾中的所有資料。

備份

在非元件型備份中,SQL 寫入器會使用快照集中的磁碟區清單,以隱含方式選取資料庫。 程式會檢查資料庫是否有損毀,若發現則引發錯誤。 損毀資料庫是指在磁碟區清單中選取了一部分檔案的資料庫。 透過 SQL 寫入器不支援還原之後的向前復原(差異或記錄還原)。

還原

要求者會還原以非元件為基礎的模式備份的資料庫。 這類還原無法後續進行向前復原,例如日誌還原或差異還原。

針對非元件型還原作業,還原必須在 SQL Server 實例脫機的情況下執行,否則目標資料庫會卸除/中斷連結,以確保檔案離線。 檔案會就地複製,然後附加資料庫。 全部都會在 SQL 寫入器的範圍外進行。

以元件為基礎的備份和還原

在以元件為基礎的備份中,要求者會明確選取要備份/還原的資料庫元件 (從 SQL 寫入器傳回給用戶端的中繼資料)。

備份

在以元件為基礎的備份中,所選資料庫的所有備份磁碟區都應該包含在磁碟區快照集中。 否則,SQL 寫入器會偵測到快照集外部備份磁碟區中的撕裂的資料庫,並導致備份失敗。 完整備份會備份資料庫資料和所有必要的記錄檔,以便在還原時將資料庫回復成交易一致狀態。

完全還原而不向前復原

資料庫備份的完整還原有時會完成,而不需要執行任何額外的向前復原。 這可能是因為沒有元數據來促進向前滾動,或者在某些情況下,不需要向前滾動。 本節簡短說明這兩種情況。

無元數據/無向前復原

如果在備份作業期間未儲存寫入器的中繼資料(以元件為基礎的備份中繼資料),則必須在 SQL Server 執行個體處於離線狀態時,或將目標資料庫被捨棄或中斷連結後,執行還原,以確保檔案離線。 檔案會就地複製,然後將資料庫連結上去。 全部都會在 SQL 寫入器的範圍外進行。

中繼資料存在,但無需額外的向前處理

要求者會還原已以元件為基礎的模式備份但未要求向前復原的資料庫。 在此情況下,SQL Server 會在還原時對資料庫執行當機復原。

使用附加滾動向前完成完全恢復

請求者可以指定 SetAdditionalRestores(true) 選項來發出還原。 此選項表示請求者預計進行更多的滾動前移復原(例如,記錄還原、差異還原等)。 這會指示 SQL Server 不要在還原作業結束時執行復原步驟。

這僅適用於寫入器中繼資料已在備份期間儲存,且可在還原時供 SQL 寫入器使用的情況。 SQL Server 服務必須正在執行,要求者才能指示 VSS 執行還原活動。

SQL 寫入器預期會依下列順序執行:

  1. 準備還原每個資料庫。 此活動牽涉到關閉所有檔案控制代碼,以允許要求者應用程式複製/掛接資料庫檔案。

  2. 要求者應用程式複製/掛接檔案。

  3. 完成還原 (含 NORECOVERY)。 資料庫會上線,但處於 還原 狀態。

然後,傳統 SQL Server 備份、差異或記錄可用來透過 VDI 或 Transact-SQL 向前復原資料庫,或使用 VSS 架構來套用差異還原。

全文支援

SQL 寫入器會報告寫入器元數據檔中資料庫元件下具有遞歸檔案規格的全文檢索目錄容器。 選取資料庫元件時,它們會自動包含在備份中。

差異備份和還原

差異備份作業只會備份自最近基底完整備份後已變更的資料。 差異備份只會包含資料庫檔案的已變更部分。 若要進行這類備份,要求者(備份應用程式)將需要資料庫檔案中變更位置的相關信息,以便備份適當的檔案區段。 在差異備份作業期間,SQL 寫入器會以 VSS 部分檔案資訊所指定的格式提供這項資訊。 這項資訊只能用來備份資料庫檔案的已變更部分。

備份

當使用 VSS 起始備份作業時,要求者可以在備份元件檔中IVssBackupComponents::SetBackupState設定 DIFFERENTIAL 選項VSS_BT_DIFFERENTIAL,以發出差異備份。 SQL 寫入器會將部分檔案資訊(由 SQL Server 傳回)傳遞至 VSS。 要求者可以藉由呼叫 VSS API 的 IVssComponent::GetPartialFile來取得此檔案資訊。 此部分檔案資訊可讓要求者只選擇已變更的位元組範圍來備份資料庫檔案。

在備份前工作階段,SQL 寫入器可確保每個選取的資料庫都有單一差異基底。

PostSnapshot 事件期間,SQL 寫入器會從 SQL Server 取得部分檔案資訊,並使用呼叫將它新增至備份元件檔 IVssComponent::AddPartialFile

注意

SQL 撰寫器僅支援單一差異基準用於差異備份。 不支援多重基準。

部分檔案資訊格式

在差異備份期間,對於每個被備份的資料庫,SQL 編寫器會儲存每個資料庫檔案的部分檔案資訊。 要求者或備份應用程式會在實際檔案備份期間使用這項資訊,只將檔案的相關部分複製到備份媒體。

如需此部份檔案資訊格式的詳細資訊,請參閱 磁碟區陰影複製服務 (VSS)

要求者可以藉由呼叫 IVssComponent::GetPartialFileCountIVssComponent::GetPartialFile 來判斷這些檔案。 IVssComponent::GetPartialFile 會傳回指向檔案的路徑和檔名,還有一個範圍字串,表示檔案中需要備份的內容。

如需部分檔案資訊擷取的詳細資訊,請參閱 VSS 文件

備份檔案

在此階段中,備份應用程式應該查看儲存在備份元件檔中的寫入器元數據,並只備份檔案的相關部分。 (針對全文檢索目錄檔案,此備份應根據檔案時間戳來完成。本文稍後會說明這一點。

差異備份總是與資料庫存在的最新基底備份有關。 在還原時,SQL Server 會偵測不相符的基底和差異備份。 因此,備份應用程式或系統管理員必須負責確定差異相對於預期的完整備份。 如果某些頻外程式已進行另一個完整備份,備份應用程式可能無法還原差異,因為它沒有基底備份。

目前,如果位元組範圍資訊(部分檔案資訊)太大(緩衝區大小超過 64 KB),SQL Server 會擲回錯誤,指示使用者執行完整備份。

疑難排解

檔案的新增、卸除、縮減、成長、邏輯重新命名和物理重新命名會在備份疑難解答中出現有趣的案例。

在取得基底之後新增的檔案

這些檔案會包含在部分規格中,因為資料庫檔案的每個標頭都必須在部分規格中。 除了標頭頁面之外,所有配置的頁面都必須包含在部分規範中。

在取得基底之後捨棄的檔案

在基地被占領後,資料檔案可以棄置。 在差異備份中,這類檔案不會包含在寫入器的元數據文件中。 此外,沒有任何部分資訊與卸除的檔案相關聯。

在取下基底之後,檔案會縮小

在伺服器中停用檔案壓縮之前,不會從檔案收集部分資訊。 這可確保 VSS 永遠不會包含對應至數據檔壓縮區域的任何部分資訊。

基底建立後增加的檔案

如果擴展發生在收集部分資訊之前,則收集的部分資訊應該包含擴展區域中已配置的頁面。 如果在收集部分資訊之後發生成長,則部分資訊不會包含成長區域中的變更。 在下列各節中,您會看到記錄向前復原會還原這類變更。

在取基底之後,檔案邏輯地重新命名

檔案的邏輯重新命名不會影響備份或還原,因為檔案的邏輯名稱不會在寫入器元數據檔或備份元件檔中的任何位置參考。

如需詳細資訊,請參閱 寫入器元數據檔: 本文稍後的範例。

建立基底之後實際重新命名的檔案

實體資料庫檔案重新命名在資料庫重新啟動之前不會生效。 因此,部分資訊緩衝區中的資料庫組態資訊或檔案路徑資訊仍然是以舊實體路徑為基礎,這是快照集上這些資料庫檔案的唯一有效路徑。

還原

在進行差異還原時,要求者傳回給 SQL 寫入器的備份元資料中包含了備份類型資訊。 因此,SQL 寫入器不需要進行特殊處理。 SQL Server 會自行找出它是差異還原。 SQL Server 會以與未透過 VSS 執行的原生差異還原相同的方式來處理這類差異還原。

還原前階段

在此階段期間,SQL Server 會根據差異備份的檔案元數據,將所有檔案大小調整為適當的大小。 如果檔案已成長,SQL Server 就會將成長部分歸零。 如果必須建立新的檔案(在建立基底之後建立),SQL Server 就會將新檔案歸零。 它也會關閉所有的檔案控制代碼,讓備份應用程式可以使用來自備份媒體的還原資料以覆寫檔案。

還原檔案

用戶端應該根據部分檔案規格來還原檔案。 資料應該還原到資料庫檔案的相同位移/範圍,如儲存在寫入器中繼資料中的部分檔案規格所指定。

資料庫檔案新增/卸除/growth/shrink/logical-rename/physical-rename 再次讓還原時發生有趣的疑難解答案例。

如果在取得完整基底之後已新增資料庫檔案

在還原準備階段期間,SQL Server 必須預先建立這類檔案。 這類檔案應該已擴充到正確的大小,並已歸零。用戶端只需要根據部分規格來配置資料 (部分規格包含所有配置的範圍)。

如果在取得完整基底之後已卸除資料庫檔案

SQL Server 所提供的部分資訊不包含這類檔案捨棄的任何追蹤資訊。 SQL Server 會負責偵測要刪除的檔案,方法是比較已還原的檔案中繼資料與現有的容器,並實際予以刪除。 這會在還原之前完成,做為準備步驟。

如果資料庫檔案自取得完整基底后已成長

這類檔案必須在還原準備階段期間,由 SQL Server 擴充至正確的大小。 擴充區域也必須由 SQL Server 設為零。 因此,即使在成長區域中,用戶端也可以安全地根據部分規格來配置資料。 如果在取得部分資訊之後成長檔案,則會藉由重新執行備份的記錄檔以及差異備份來還原成長區域中的變更。

如果資料庫檔案自取得完整基底后已縮減

SQL Server 會負責根據中繼資料,將檔案截斷成所需的大小。 這會在還原之前完成,做為準備步驟。

如果自建立完整基底之後,資料庫檔案已以邏輯方式重新命名

這不會影響還原,因為邏輯名稱不會出現在寫入器元數據檔或備份元件檔中。 當用戶端將變更套用至包含系統目錄資訊的主資料庫檔案時,就會還原邏輯名稱變更。

如果自取得完整基底之後,資料庫檔案已實際重新命名

如果在差異備份時,重新命名尚未生效,則用戶端仍會將數據還原至舊位置。 資料庫在還原後重新啟動會導致實體重新命名生效。 如果在差異備份時,實體檔案重新命名已經生效,則會從新的實體路徑備份部分數據。

還原後

在還原後事件期間,SQL 寫入器會執行資料庫的一般重做作業和復原(如果 SetAdditionalRestores() 設定為 False)。

全文檢索目錄的差異備份和還原

SQL Server 全文檢索目錄是資料庫資源的一部分,其必須與資料庫檔案的其餘部分一起備份或還原。 差異備份是根據時間戳記為基礎進行的,用於全文檢索目錄。 SQL Server VSS 的差異備份與還原是以單一基底備份為基礎。 換句話說,沒有為不同容器設計的不同底座。 針對 VSS 全文檢索目錄備份,這表示對於所有全文檢索目錄容器而言,差異備份是以單一時間戳為基礎,不同於原生 SQL Server 差異備份的情況,其中每個全文檢索目錄容器都有一個時間戳基底。

在 VSS 中,此時間戳記會以完整備份期間所設定的全元件屬性表示,並在後續的差異備份期間使用。

OnIdentify

OnIdentify中,SQL 寫入器會呼叫 IVssCreateWriterMetadata::SetBackupSchema() 以設定 值 VSS_BS_TIMESTAMPED。 這表示 SQL 撰寫器負責管理差異資料庫,並向備份程式表明這一點。

設定基底時間戳

基底時間戳記是在完整備份期間所設定。 在 OnPostSnapshot() 中,寫入器會叫用 IVssComponent::SetBackupStamp() ,將時間戳記與元件一起儲存在備份文件中。

差異備份

備份應用程式會從基底完整備份擷取此時間戳,並呼叫 IVssComponent::GetBackupStamp() 來擷取先前基底備份中的基底戳記,讓寫入器可以使用時間戳。 然後,它會呼叫 IVssBackupComponent::SetPreviousBackupStamp() 將其提供給寫入器。 寫入器會接著呼叫 IVssComponent::GetPreviousBackupStamp() 來擷取戳記,並將其轉譯為用於 IVssComponent::AddDifferencedFilesByLastModifyTime() 的時間戳記。

差異備份時備份應用程式的責任

在差異備份期間,備份應用程式會負責:

  • 在元件中,備份所有上次修改時間戳記大於上次修改時間所指定之時間戳的檔案(包括整個檔案)。

  • 追蹤和偵測已刪除的檔案。

在差異還原期間備份應用程式的責任

在差異還原期間,備份應用程式會負責:

  • 還原所有已備份的檔案,方法是在檔案不存在時建立新檔案,或覆寫現有的檔案。

  • 如果還原檔案大於現有檔案,請先擴充檔案,再寫入內容。

  • 如果還原檔案小於現有檔案,請將檔案截斷成與還原檔案相同的大小。

  • 刪除應刪除的所有檔案;也就是說,那些不應該存在於差異備份時間點的檔案。

僅限複製備份

有時需要進行適用於特殊用途的備份。 例如,您可能需要建立資料庫複本來進行測試。 此備份不應影響資料庫的整體備份和還原程式。 COPY_ONLY使用 選項會指定備份是在頻外完成,而且不應該影響一般備份順序。 SQL 寫入器支援在 SQL Server 實例上執行的僅複製備份類型。

在備份探索階段,SQL 寫入器會使用 IVssCreateWriterMetadata::SetBackupSchema 呼叫來設定支援的備份架構選項VSS_BS_COPY,以指出其僅複製備份的功能。 要求者可以將備份類型設定為僅複製備份,方法是使用呼叫 IVssBackupComponents::SetBackupState將 選項設定VSS_BACKUP_TYPEVSS_BT_COPY

選取僅複製備份時,假設磁碟上的檔案會複製到備份媒體(由要求者),而不論每個檔案的備份歷程記錄的狀態為何。 SQL Server 不會更新備份記錄。 這種類型的備份不會構成進一步差異備份作業的基礎備份,也不會干擾先前差異備份的歷程記錄。

使用移動還原

VSS 允許要求者 (備份應用程式) 使用 IVssComponent::SetNewTarget 呼叫來指定新的還原目標。 PreRestore()在 和 PostRestore()中,SQL 寫入器會檢查是否至少指定了一個新的目標。 備份應用程式負責在實際檔還原/複製期間實際將檔案複製到新位置。

備份應用程式只能指定新的實體路徑目標,不能指定檔案規格。 例如,對於位於 c:\data\test.mdf的資料庫檔案,無法變更實際檔名 test.mdf 。 只能變更路徑 c:\data 。 針對位於 c:\ftdata\foo的全文檢索目錄容器,因為 VSS 中的檔案規格是 "*" ,而且 VSS 中的路徑規格是 c:\ftdata\foo,因此可以變更整個路徑。

資料庫重新命名

要求者可能需要以新名稱還原 SQL Server 資料庫,特別是當資料庫與原始資料庫並存還原時。 在還原作業期間,要求者可以指定這個選項,方法是使用 VSS 呼叫IVssBackupComponents::SetRestoreOptions()wszRestoreOptions將自定義還原選項設定為 “New Component Name” = <“New Name”。>

SQL 寫入器會取得新元件名稱值的整個內容,並將其作為還原資料庫的新名稱。 如果未指定任何選項,SQL Server 會使用其原始名稱(元件名稱)還原資料庫。

注意

SQL 寫入器目前不支援 跨實例重新命名 ,以將資料庫移至新的實例。

自動回復的快照

一般而言,使用 VSS 架構取得的 SQL Server 資料庫快照集會處於非復原狀態。 在進行復原階段之前,無法安全地存取快照集中的數據,以復原進行中的交易,並將資料庫置於一致狀態。 由於快照集處於只讀狀態,因此無法透過一般附加資料庫的程序恢復。

在快照集建立程式中,可以自動復原快照集。 作為寫入器元資料文件的一部分,SQL 寫入器指定元件旗標 VSS_CF_APP_ROLLBACK_RECOVERY 以指示在指定快照集時,必須先在快照上的資料庫執行復原,才能存取該資料庫。要求者可以指出快照集應該是應用程式回滾快照集(這表示快照中的所有資料庫檔案都應處於一致的狀態以供應用程式使用)或備份快照集(用於在系統失敗時,備份日後需還原的數據)。

要求者應該設定 VSS_VOLSNAP_ATTR_ROLLBACK_RECOVERY,以指出此元件是針對非備份目的而進行備份。 VSS 接著會將 SQL 寫入器與所選元件上的 VSS_CF_APP_ROLLBACK_RECOVERY 相互關聯VSS_VOLSNAP_ATTR_ROLLBACK_RECOVERY,並判斷正在進行自動復原。 VSS 讓快照可在限定時間內被寫入,並自動將位新增 VSS_VOLSNAP_ATTR_AUTORECOVERY 至快照內容。

在 SQL Server 中,自動復原應該只套用至應用程式復原快照集,但不適用於備份快照集。 對於應用程式回滾快照,SQL 寫入器會在 PostSnapShotevent 中啟動自動復原過程。 這個程序會針對快照集中每一個明確選取的 SQL Server 資料庫執行下列動作:

  • 將快照集資料庫附加至原始 SQL Server 執行個體 (也就是原始資料庫所附加的執行個體)。

  • 復原資料庫 (這會在「附加」作業過程中發生)。

  • 壓縮記錄檔。

    如果 VSS 提供者是 軟體提供者,這會減少 VSS 架構需要完成的不必要的寫入複製數量。 壓縮記錄檔是預設行為。 將下列登錄機碼的值設為 1,即可停用此設定。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLWriter\Settings\DisableLogShrink
    

    這在可能使用快照從日誌的特定時間點上匯出特定頁面的數據以修正在線資料庫問題的情境下,可能會很有用。

  • 卸離資料庫。

現在有一致且已復原的快照集可以附加以供查詢。

多資料庫交易

在舊版 SQL Server 中,快照集資料庫有時會包含一些即時的多資料庫交易。 在還原作業期間,SQL 寫入器會使用 [推定中止] 選項將資料庫附加到快照集上。 這將回滾尚未提交的任何多資料庫交易(包括處於準備提交狀態的任何交易)。 這可能會導致快照集中的資料庫之間發生一些不一致的情況。

例如,請考慮兩個資料庫 A 和 B。這兩個資料庫之間有分散式交易,而此交易在資料庫 A 中處於認可狀態,且資料庫 B 中處於準備認可狀態。在自動回復程式中,此交易會在資料庫 A 中認可,並在資料庫 B 中回復。這可能會導致快照集中的某些不一致。

較新版本的 Windows 已改善Microsoft分散式交易協調器 (MS DTC) 元件,可修正跨 SQL Server 實例跨資料庫之交易的這項不一致問題。 較新版本的 SQL Server 會針對跨越 SQL Server 實例內資料庫的交易修正這些不一致之處。

自動修復快照檔的安全性影響

針對 VSS 快照集,在自動復原之後,檔案會使用訪問控制清單 (ACL) 來保護,只允許存取 SQL Server 帳戶所屬的特殊內建群組。 這表示 Box admin 或該特殊群組的成員都能夠附加資料庫。 要求附加快照中的資料庫檔案的客戶端必須是 Builtin/Administrators 的成員或 SQL Server 帳戶的成員。

簡單恢復模式用戶資料庫

如果master資料庫與使用簡單恢復模式的使用者資料庫一起還原,可以使用與master資料庫相同的方法來還原這些使用者資料庫:將實例關閉後,只需複製或掛載磁碟區。 啟動 SQL 執行個體時,即會復原所有內容。

向前滾動使用者資料庫

如果要復原並滾動前移用戶資料庫與 master 資料庫復原,實例不能同時啟動並復原 master 和用戶資料庫。

此程序如下所示:

  1. 確定已停止 SQL Server 執行個體。

  2. 分兩階段執行還原。

    1. 透過檔案複製或透過 VSS,還原應該同時復原的系統資料庫和用戶資料庫(也就是簡單恢復模式中的用戶資料庫)。

      • 如果要向前復原的使用者資料庫與系統資料庫不在相同的磁碟區上,則此時不應該將該磁碟區帶回。 此案例需要在備份之前進行規劃。

      • 如果使用者資料庫與系統資料庫位於相同的磁碟區,則必須向 SQL Server 隱藏使用者資料庫。

    2. 使用 -f 參數啟動 SQL Server 實例。 (使用 -f 啟動選項時,只有 master 資料庫可以被還原。)

      1. 針對要向前復原的每個資料庫發出 ALTER DATABASE <database> SET OFFLINE 或分離該資料庫。

      2. 停止 SQL Server 執行個體。

      3. 啟動 SQL Server 實例(SQL Server 無法看到需要向前復原的使用者資料庫文件)。

使用 VSS 來還原用戶資料庫 WITH NORECOVERY,如完整還原及額外前滾操作中所述。

寫入器元數據檔:範例

名為DB1的資料庫,屬於機器Server1上的 SQL Server 實例Instance1,包含下列資料庫/記錄檔:

  • 命名為 “primary” 的資料庫檔案儲存於 c:\db\DB1.mdf
  • 名為「secondary」的資料庫檔案儲存在 c:\db\DB1.ndf
  • 儲存在 c:\db\DB1.ldf 的資料庫記錄檔,名為 “log”
  • 名為「foo」的全文索引目錄儲存在c:\db\ftdata\foo目錄下
  • 儲存在目錄下名為 「bar」 的全文檢索目錄 c:\db\ftdata\bar

下列為資料庫的寫入器中繼資料:

資料庫層級檔案群元件

主要資料庫檔案:

ComponentType: VSS_CT_FILEGROUP
LogicalPath: "Server1\Instance1"
ComponentName: "DB1"
Caption: NULL
pbIcon: NULL
cbIcon: 0
bRestoreMetadata: FALSE
NotifyOnBackupComplete: TRUE
Selectable: TRUE
SelectableForRestore: TRUE
ComponentFlags: VSS_CF_APP_ROLLBACK_RECOVERY

次要資料庫檔案:

LogicalPath: "Server1\Instance1"
GroupName: "DB1"
Path: "c:\db"
FileSpec: "DB1.mdf"
Recursive: FALSE
AlternatePath: NULL
BackupTypeMask: VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED
Filegroup file
LogicalPath: "Server1\Instance1"
GroupName: "DB1"
Path: "c:\db"
FileSpec: "DB1.ndf"
Recursive: FALSE
AlternatePath: NULL
BackupTypeMask: VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED

完整文字檔 log:

LogicalPath: "Server1\Instance1"
GroupName: "DB1"
Path: "c:\db"
FileSpec: "DB1.ldf"
Recursive: FALSE
AlternatePath: NULL
BackupTypeMask: VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED

完整文字檔 foo:

LogicalPath: "Server1\Instance1"
GroupName: "DB1"
Path: "c:\db\ftdata\foo"
FileSpec: "*"
Recursive: TRUE
AlternatePath: NULL
BackupTypeMask: VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED

完整文字檔工具列:

LogicalPath: "Server1\Instance1"
GroupName: "DB1"
Path: "c:\db\ftdata\bar"
FileSpec: "*"
Recursive: TRUE
AlternatePath: NULL
BackupTypeMask: VSS_FSBT_ALL_BACKUP_REQUIRED | VSS_FSBT_ALL_SNAPSHOT_REQUIRED

如果伺服器實例是計算機上的預設實例,邏輯路徑會變成一個部分: Server1

特殊案例

本節描述以 SQL 寫入器為基礎的備份與還原作業期間所遇到一些特殊案例。

自動關閉資料庫

針對非元件型備份,會在檢查損毀狀況時自動關閉資料庫,但在備份作業期間不會明確凍結自動關閉的資料庫。

此處的預期案例是有許多已關閉的資料庫可能存在,而您想要將快照集的成本降到最低。 已自動關閉資料庫通常會用於資源短缺的低階組態。

檔案清單

每個資料庫的檔案清單會在準備備份事件之前,於列舉步驟期間決定。 如果資料庫檔案清單在列舉到凍結之間有所變更,除非應用程式重新檢查檔案清單,否則資料庫可能已損毀。 雖然此案例不太可能,但廠商需要注意。

已停止的執行個體

如果在列舉步驟發生時未執行 SQL Server 的實例,則無法選取這些實例的資料庫。

如果執行個體在列舉到「準備備份」事件之間停止,則會忽略已停止執行個體中的任何資料庫。

系統和用戶資料庫

SQL Server 中的系統資料庫包括 masterSQL Server 隨附和安裝的、 modelmsdb 資料庫。 本節描述如何在 VSS 快照集備份程序中處理這些資料庫。

master資料庫只能藉由停止 實例、取代資料庫檔案(由備份應用程式完成),然後重新啟動 實例來還原。 無法向前復原。

SQL 寫入器支援在線還原 modelmsdb 資料庫,而不需要關閉實例。