共用方式為


備份複雜儲存系統中的請求者角色

如同 VSS 下的所有重要作業,進行 增量差異 備份時,需要要求者與寫入者之間密切合作。

備份類型

基礎結構提供五種備份類型的特殊支援。 其描述如下:

  • 完整 (VSS_BT_FULL)。 不論其上次備份日期為何,都會備份檔案。 將會更新每個檔案的備份歷程記錄,而這種類型的備份可作為增量或差異備份的基礎。 如果有記錄檔,可能會因為此備份而遭到截斷。

    還原完整備份只需要單一備份映像。

  • 差異(VSS_BT_DIFFERENTIAL)。 VSS API 用來確保只有自從上次完整備份之後已變更或新增的檔案才會複製到記憶體媒體;會忽略所有中繼備份資訊。 這可能包括整個檔案,或檔案內的特定範圍。 差異備份與完整備份相關聯,而且在還原完整備份之前通常無法還原。 如果有記錄檔,通常不會因為此備份而遭到截斷。

    還原差異備份需要原始備份映像和上次完整備份之後所建立的最新差異備份映像。

  • 累加式 (VSS_BT_INCREMENTAL)。 VSS API 是用來確保只有自上次完整或增量備份之後已變更或新增的檔案,才會複製到儲存媒體。 這可能包括整個檔案,或檔案內的特定範圍。 某些寫入器不允許增量備份與差異備份混合。 如果有記錄檔,可能會因為此備份而遭到截斷。

    還原增量備份需要原始備份映像和自初始備份之後建立的所有增量備份映像。

  • 記錄備份 (VSS_BT_LOG)。 只會備份寫入器的記錄檔(已新增至具有 IVssCreateWriterMetadata::AddDataBaseLogFiles 方法的元件,並由呼叫 IVssWMComponent::GetDatabaseLogFile擷取)。 此備份類型專屬於 VSS。 日誌備份通常會相當頻繁地進行。 一般而言,記錄檔將會因為此備份而遭到截斷。

  • 複製備份 (VSS_BT_COPY)。 就像VSS_BT_FULL備份類型一樣,不論其上次備份日期為何,都會備份檔案。 不過,不會更新每個檔案的備份歷程記錄,而且這種備份無法做為增量或差異備份的基礎。 記錄檔不應該因為複製備份而遭到截斷。

部分檔案支援

某些程式藉由覆寫它們所管理檔案的部分內容來實現檔案還原功能。 要求者可能設計來利用這項功能,如果是的話,它會藉由在 IVssBackupComponents::SetBackupState中設定資訊來指出這一點。

要求者透過 IVssBackupComponents::SetBackupStatebackupType 參數指定正在執行的備份類型。 不同的作者會支援不同類型的備份。 呼叫 IVssBackupComponents::GatherWriterMetadata 之後,要求者可以呼叫 IVssExamineWriterMetadata::GetBackupSchema來判斷指定寫入器支持的備份類型。 傳回的值是位掩碼,表示支援不同的備份類型。 VSS_BS_DIFFERENTIAL 表示支持差異備份、增量備份 VSS_BS_INCREMENTAL、記錄備份 VSS_BS_LOG,以及複製備份的 VSS_BS_COPY;所有寫入器都必須支援完整備份。 如果寫入器不支援混合增量備份與差異備份,將會新增 VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL 旗標。 如果要求者正在執行增量或差異備份,且指定的寫入器不支援該備份類型,則應該在該寫入器上執行完整備份。

備份戳記

增量和差異備份一律會系結至先前的備份。 有兩種方式可以綁定備份。 針對簡單的數據存放區,要求者可以追蹤備份之間的相互關聯。 不過,對於更複雜的資料儲存區,寫入器需要自行管理與備份相關的時間戳;時間戳可能會記錄日誌位置、檢查點資訊等。 要求者可以藉由檢查 IVssExamineWriterMetadata::GetBackupSchema所傳回的值中的 VSS_BS_TIMESTAMPED 位元,來判斷指定的寫入器是否需要儲存自己的時間戳。

在備份中儲存時間戳的寫入器會在處理 IVssBackupComponents::PrepareForBackup 時,或處理 IVssBackupComponents::DoSnapshotSet時,新增時間戳。 要求者可以呼叫 IVssComponent::GetBackupStamp來取得此時間戳。 執行增量或差異備份時,要求者必須將目前的備份系結至某些先前的備份。 這是藉由從特定元件的上一個備份取得時間戳,並將其傳遞至 IVssBackupComponents::SetPreviousBackupStamp 函式來完成;這必須針對先前備份中備份的每個元件完成。

備份檔案

備份寫入器所報告的檔案

寫入器在 GatherWriterMetadata 階段期間新增至其元數據的每個檔案規格都包含一個備份類型遮罩,指定何時應該備份檔案。 請求者會呼叫 IVssWMFiledesc::GetBackupTypeMask來判斷此掩碼是什麼。 此遮罩中的值用於判斷哪些備份類型需要備份檔案規格。 遮罩可以包含下列一或多個位元值:

VSS_FSBT_FULL_BACKUP_REQUIRED

完整備份的必需項目。

需要VSS_FSBT差異備份

差異備份的必要專案。

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

增量備份所需。

VSS_FSBT_LOG_BACKUP_REQUIRED

執行記錄備份所需。

VSS_FSBT_ALL_BACKUP_REQUIRED

所有備份類型都需要;這是預設值。

此規格會覆寫元件的篩選性規格。 例如,假設有一個元件,其檔案全都標示為 VSS_FSBT_LOG_BACKUP_REQUIRED,但未標示為 VSS_FSBT_FULL_BACKUP_REQUIRED。 假設呼叫 IVssCreateWriterMetadata::AddComponent時,無法選取此元件進行備份(bSelectable 為 false)。 在記錄備份的情況下,這表示此元件中的所有檔案都必須一律備份。 不過,如果是完整備份,則不需要備份任何檔案,儘管元件選擇性表示應該備份它。

依上次修改時間備份

IVssBackupComponents::GatherWriterMetadata 階段中指定的檔案規格資訊不會提供要求者自上次備份後變更的內容相關信息。 作者向請求者指出變更的一種方式是使用差異檔案機制。 撰寫者可以指定元件中的特定檔案只有自某特定時間以來已被修改時才應該備份,撰寫者可以在 IVssBackupComponents::PrepareForBackupIVssBackupComponents::DoSnapshotSet中指定這些檔案。 要求者可以呼叫 IVssComponent::GetDifferencedFilesCountIVssComponent::GetDifferencedFile來判斷這些檔案。 如果檔案規範符合在 IVssBackupComponents::GatherWriterMetadata 中設定且目前根據備份類型遮罩有效的規範,差異檔案資訊將覆寫先前的資訊;也就是說,只有當符合該檔案規範的檔案自指定時間以來有過修改時才會被備份。 上次修改時間會使用 FILETIME 結構進行通訊。 如果這個結構的值是零,這表示應該根據要求者上次備份時間的記錄來決定上次修改時間。

部分文件備份

作者向要求者指示變更的另一種方式是使用部分檔案的機制。 寫入者可以在需要備份的元件檔案內指定位元組範圍,寫入者可以在 IVssBackupComponents::PrepareForBackupIVssBackupComponents::DoSnapshotSet中指定這些檔案範圍。 要求者可以呼叫 IVssComponent::GetPartialFileCountIVssComponent::GetPartialFile來判斷這些檔案。 IVssComponent::GetPartialFile 會傳回指向檔案的路徑和檔名,以及指出檔案中哪些內容需要備份的範圍字串。 與差異檔案相同,如果路徑和檔名符合寫入器在 IVssBackupComponents::GatherWriterMetadata中設定的檔案規格,則部分檔案資訊會覆寫先前的設定。 範圍字串可以有兩種格式:它可以直接指定範圍,也可以指定包含範圍信息的檔案。 如果直接指定範圍,語法是逗號分隔的清單格式:offset1:length1、offset2:length2,其中每個位移和長度都是 64 位無符號整數。 如果指定範圍檔案,則範圍字串應設定為 File= filename,其中 filename 是範圍檔案的完整路徑。 範圍檔案本身是格式為 64 位無符號整數清單的二進位檔。 第一個整數表示檔案中的範圍數目。 每個後續的整陣列都代表範圍的位移和長度。 要求者也必須小心備份和還原此範圍檔案。

檔案規格規則

透過差異檔案和部分檔案機制新增的檔案規格,將會修改在 IVssBackupComponents::GatherWriterMetadata 中設定的檔案規格,或新增全新的檔案。 如果使用部分檔案機制修改在 IVssBackupComponents::GatherWriterMetadata 中設定的檔案規格,則要求者可以預期檔案規格完全符合 IVssBackupComponents::GatherWriterMetadata元件中設定的其中一個檔案規格。 檔案規格不會有部分重疊於另一個檔案規格,也不會符合該作者的其他元件中任何檔案規格。 不過,使用部分檔案機制新增的檔案規格可能會部分重疊另一個檔案規格。 當這為 true 時,差異檔案或部分檔案規格會取代 IVssBackupComponents::GatherWriterMetadata中的規格集。 一般檔案規格可以有替代位置值(由 IVssWMFiledesc::GetAlternateLocation傳回),表示從備份時間取得檔案的替代位置。 如果透過差異檔案或部分檔案機制所設定的檔案規格符合具有替代位置的現有檔案規格,則應該從這個替代位置挑選數據。 如果透過差異檔案或部分檔案機制所設定的檔案規格不符合元件的任何現有規格,則現在應該將這些檔案範圍新增至備份。 要求者可以預期只有已包含在陰影複製集中的磁碟區上的檔案會使用下列其中一個機制來新增。

未使用陰影複製的備份

某些類型的檔案可能不需要從陰影複製磁碟區中備份。 例如,這通常是資料庫日誌檔案常常成立或正確的情況。 由於記錄檔會單調成長,而且寫入器可以確切指定使用部分檔案備份的檔案部分,因此通常可以備份原始磁碟區中的記錄檔。 作為優化的一部分,撰寫者可以使用備份類型遮罩來標記哪些檔案需要陰影複製來進行不同備份類型。 從 IVssWMFiledesc::GetBackupTypeMask 傳回的值可以包含下列一或多個位值:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

完整備份需要陰影複本。

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

差異備份需要影子複本。

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

增量備份需要卷影複製。

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

日誌備份所需的陰影副本。

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

所有備份類型都需要陰影複製功能;這是預設設定。

如果特定磁碟區只包含不需要此備份陰影複製的元件,要求者可以略過為此磁碟區建立陰影複製的步驟。 此磁碟區上的所有數據都可以直接從原始磁碟區複製到備份媒體。

還原檔案

循序還原

要求者執行還原作業之後,會將PostRestore事件傳送給所有寫入器。 通常,作者會透過執行復原或其他還原後操作來處理此事件。 不過,還原增量備份通常會按照一系列的還原作業進行,每個增量備份需要對應一次還原作業。 要求者必須通知撰寫者,這項還原操作正在進行中,以防止復原或避免其他不想要的操作發生,直到還原完全完成為止。 這是藉由呼叫 IVssBackupComponents::SetAdditionalRestores來完成。 此方法會針對每個元件被呼叫,並向撰寫者指出該元件還會有更多復原作業。 針對順序中的最終還原,其他還原旗標應該設定為 false (其預設值),這表示這是該元件序列中的最後一次還原。

新目標

如果寫入器支援,要求者可以將數據檔還原到原始備份時間位置以外的位置。 要求者可以呼叫 IVssExamineWriterMetadata::GetBackupSchema來檢查此支援。 如果寫入器支援此行為,則 VSS_BS_WRITER_SUPPORTS_NEW_TARGET 位會被設定。 請求者會針對每個重新放置的檔案規格呼叫 IVssBackupComponents::AddNewTarget,通知寫入器新位置。 要求者也可以決定將特定範圍檔案還原至不同的位置。 要求方透過呼叫 IVssBackupComponents::SetRangesFilePath通知撰寫者這項變更。

導向目標

針對複雜的還原案例,寫入器可能會想要將備份檔案的範圍對應至相同或不同檔案的不同範圍。 這可以使用導向目標機制來完成。 要求者可以在 IVssBackupComponents::PreRestore 階段之後判斷,此機制是透過呼叫 IVssComponent::GetRestoreTarget 並檢查返回 VSS_RT_DIRECTED來用於某個元件。 要求者可以藉由呼叫 IVssComponent::GetDirectedTargetCountIVssComponent::GetDirectedTarget來取得所有這些重新導向還原。 IVssComponent::GetDirectedTarget 會傳回備份上來源檔案的完整路徑,以及還原目的地檔案的完整路徑。 它也會傳回每個檔案的範圍清單。 然後,要求者會負責將來源檔案中的指定範圍還原至目的地檔案中的對應範圍。 範圍字串的格式與 IVssComponent::GetPartialFile相同。