備份複雜存放區中的要求者角色
如同 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::SetBackupState的backupType參數執行哪種類型的備份。 不同的寫入器將支援不同類型的備份。 呼叫 IVssBackupComponents::GatherWriterMetadata 之後,要求者可以呼叫 IVssEx,WriterMetadata::GetBackupSchema來判斷指定寫入器支援的備份類型。 傳回的值是位元遮罩,表示支援不同的備份類型。 VSS_BS_DIFFERENTIAL 表示支援差異備份、 增量備份VSS_BS_INCREMENTAL 、記錄備份 的VSS_BS_LOG ,以及複本備份 VSS_BS_COPY ;所有寫入器都必須支援完整備份。 如果寫入器不支援混合增量備份與差異備份,也會新增 VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL 旗標。 如果要求者正在執行增量或差異備份,而且指定的寫入器不支援該備份類型,則應在該寫入器上執行完整備份。
備份戳記
增量和差異備份一律會系結至先前的備份。 有兩種方式可以系結備份。 對於簡單的資料存放區,要求者可以追蹤備份之間的相互關聯。 不過,對於更複雜的資料存放區,寫入器將需要使用備份來維護自己的時間戳記;此時間戳記可能會追蹤記錄位置、檢查點資訊等等。 要求者可以藉由檢查IVssEx,writerMetadata::GetBackupSchema所傳回的值中檢查VSS_BS_TIMESTAMPED位,判斷指定的寫入器是否需要儲存自己的時間戳記。
在備份中儲存時間戳記的寫入器會在處理 IVssBackupComponents::P repareForBackup 或處理 IVssBackupComponents::D oSnapshotSet時新增時間戳記。 要求者可以藉由呼叫 IVssComponent::GetBackupStamp來取得此時間戳記。 執行增量或差異備份時,要求者必須將目前的備份系結至一些先前的備份。 這是藉由從特定元件的先前備份取得時間戳記,並將它傳遞至 IVssBackupComponents::SetPreviousBackupStamp 函式來完成;這必須針對先前備份中備份的每個元件完成。
備份檔案
備份寫入器所報告的檔案
寫入器在 GatherWriterMetadata 階段期間新增至其中繼資料的每個檔案規格都包含一個備份類型遮罩,指定何時應該備份檔案。 要求者會呼叫 IVssWMFiledesc::GetBackupTypeMask來判斷此遮罩是什麼。 此遮罩中的值可用來判斷需要備份檔案規格的備份類型。 遮罩可以包含下列一或多個位值:
-
VSS_FSBT_FULL_BACKUP_REQUIRED
-
完整備份的必要專案。
-
VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED
-
差異備份的必要專案。
-
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::P repareForBackup 或 IVssBackupComponents::D oSnapshotSet中指定這些檔案。 要求者可以呼叫 IVssComponent::GetDifferencedFilesCount 和 IVssComponent::GetDifferencedFile來判斷這些檔案。 如果檔案規格符合 IVssBackupComponents::GatherWriterMetadata (中的一個集合,則根據備份類型遮罩目前有效,) 差異檔案資訊會覆寫先前的資訊;也就是說,符合該檔案規格的檔案現在只有在指定時間之後已經過修改時,才會備份這些檔案。 上次修改時間是使用 FILETIME 結構進行通訊。 如果這個 結構的值是零,這表示應該根據要求者上次備份時間的時間記錄來決定上次修改時間。
部分檔案備份
寫入器表示要求者變更的另一種方式是使用部分檔案機制。 寫入器可以在需要備份的元件檔案內指定位元組範圍;寫入器可以在 IVssBackupComponents::P repareForBackup 或 IVssBackupComponents::D oSnapshotSet中指定這些檔案範圍。 要求者可以呼叫 IVssComponent::GetPartialFileCount 和 IVssComponent::GetPartialFile來判斷這些檔案。 IVssComponent::GetPartialFile 會傳回指向檔案的路徑和檔案名,以及指出檔案中需要備份的專案的範圍字串。 如同差異檔案,如果路徑和檔案名符合 IVssBackupComponents::GatherWriterMetadata中的寫入器所設定的檔案規格,則部分檔案資訊會覆寫先前的設定。 範圍字串可以有兩種格式:它可以直接指定範圍,也可以指定包含範圍資訊的檔案。 如果直接指定範圍,則語法是位移 1:length1、offset2:length2 格式的逗號分隔清單,其中每個位移和長度都是 64 位不帶正負號的整數。 如果指定範圍檔案,則 ranges 字串應該設定為 File= filename,其中 filename 是範圍檔案的完整路徑。 範圍檔案本身是二進位檔案,格式為 64 位不帶正負號的整數的清單。 第一個整數表示檔案中有多少範圍。 每個後續的整陣列都代表範圍的位移和長度。 要求者也必須負責備份和還原此範圍檔案。
檔案規格規則
透過 differenced-file 和部分檔案機制新增的檔案規格,將會修改 IVssBackupComponents::GatherWriterMetadata 中設定的檔案規格,或新增全新的檔案。 如果使用部分檔案機制修改 IVssBackupComponents::GatherWriterMetadata 中設定的檔案規格,則要求者可以預期檔案規格完全符合 IVssBackupComponents::GatherWriterMetadata元件中設定的其中一個檔案規格。 檔案規格不會部分重迭另一個檔案規格,而且不符合該寫入器元件的任何其他檔案規格。 不過,使用部分檔案機制新增的檔案規格可以部分重迭另一個檔案規格。 若為 true,differenced-file 或 partial-file 規格會覆寫 IVssBackupComponents::GatherWriterMetadata中設定的規格。 一般檔案規格可以有替代位置值, (IVssWMFiledesc::GetAlternateLocation) 傳回,指出從備份時間取得檔案的替代位置。 如果透過差異檔案或部分檔案機制設定的檔案規格符合具有替代位置的現有檔案規格,則應該從這個替代位置挑選資料。 如果透過差異檔案或部分檔案機制設定的檔案規格不符合元件的任何現有規格,則現在應該將這些檔案範圍新增至備份。 要求者可以預期只有已包含在陰影複製集中的磁片區上的檔案會使用這些機制之一來新增。
沒有陰影複製的備份
某些類型的檔案可能不需要從陰影複製磁片區備份。 例如,這通常是資料庫記錄檔的 true。 由於記錄檔會以單調方式成長,而且寫入器可以確切指定使用部分檔案備份的檔案部分,因此通常可以備份原始磁片區中的記錄檔。 作為優化,寫入器可以使用備份類型遮罩來標記哪些檔案需要不同備份類型的陰影複製。 從 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 (其預設值) ,這表示這是該元件序列中的最後一次還原。
新目標
如果寫入器支援,要求者可以將資料檔案還原到原始備份時間位置以外的位置。 要求者可以藉由呼叫 IVssEx,WriterMetadata::GetBackupSchema來檢查此支援。 如果寫入器支援此行為,則會設定 VSS_BS_WRITER_SUPPORTS_NEW_TARGET 位。 要求者會針對每個重新放置的檔案規格呼叫 IVssBackupComponents::AddNewTarget ,通知寫入器新位置。 要求者也可以決定將特定範圍檔案還原至不同的位置。 要求者會呼叫 IVssBackupComponents::SetRangesFilePath,通知寫入者此變更。
導向目標
針對複雜的還原案例,寫入器可能會想要將備份檔案的範圍對應至相同或不同檔案的不同範圍。 這可以使用導向的目的機制來完成。 要求者可以在 IVssBackupComponents::P reRestore 階段之後判斷此機制正用於元件,方法是呼叫 IVssComponent::GetRestoreTarget 並檢查傳回 VSS_RT_DIRECTED。 要求者可以呼叫 IVssComponent::GetDirectedTargetCount 和 IVssComponent::GetDirectedTarget來取得所有這些重新導向還原。 IVssComponent::GetDirectedTarget 會傳回備份上來源檔案的完整路徑,以及將還原目的地檔案的完整路徑。 它也會傳回每個這些檔案的範圍清單。 然後,要求者會負責將來源檔案中的指定範圍還原至目的地檔案中的對應範圍。 範圍字串的格式與 IVssComponent::GetPartialFile的格式相同。