複雑なストアのバックアップにおけるライター ロール

VSS の下のすべての重要な操作と同様に、 増分 バックアップと 差分 バックアップでは、要求者とライターの間で緊密な協力が必要です。

バックアップの種類

インフラストラクチャでは、5 種類のバックアップに対して特別なサポートが提供されます。 暗号化ステップの説明を次に示します。

  • 完全 (VSS_BT_FULL)。 ファイルは、最後のバックアップ日に関係なくバックアップされます。 各ファイルのバックアップ履歴が更新され、この種類のバックアップを増分バックアップまたは差分バックアップの基礎として使用できます。 ログ ファイルがある場合は、このバックアップの結果として切り捨てられる可能性があります。

    完全バックアップを復元するには、1 つのバックアップ イメージのみが必要です。

  • 差分 (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 に情報を設定してこれを示します。

ライターは、Identify イベントの処理中に IVssCreateWriterMetadata::SetBackupSchema を呼び出すことによってサポートされるバックアップの種類を示します。 IVssCreateWriterMetadata::SetBackupSchema メソッドの dsSchemaMask パラメーターは、サポートされているバックアップの種類を示すビット マスクです。 すべてのライターは、完全バックアップをサポートする必要があります。

VSS_BS_DIFFERENTIAL

差分バックアップのサポートを示します。

VSS_BS_INCREMENTAL

増分バックアップのサポートを示します。

VSS_BS_LOG

ログ バックアップのサポートを示します。

VSS_BS_COPY

コピー バックアップのサポートを示します。

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

ライターが差分バックアップと増分バックアップの混在をサポートしていないことを示します。

ライターは、 CVssWriter::GetBackupType を呼び出すことによって、実行されているバックアップの種類を決定できます。 これを実行できる最も早い時点は、PrepareForBackup イベントの処理中です。 CVssWriter::GetBackupType、VSS_BACKUP_TYPE 列挙体のメンバーを返します。 バックアップの種類がライターでサポートされていない場合、ライターはバックアップを完全バックアップとして扱う必要があります。

バックアップ スタンプ

増分バックアップと差分バックアップは、常に以前のバックアップに関連付けられます。 バックアップを結び付ける方法は 2 つあります。 単純なデータ ストアの場合、リクエスターはバックアップ間の相関関係を追跡できます。 ただし、より複雑なデータ ストアの場合、ライターはバックアップで独自のタイムスタンプを維持する必要があります。このタイムスタンプは、ログの位置やチェックポイント情報などを追跡できます。 ライターは、IVssCreateWriterMetadata::SetBackupSchema を呼び出すときにVSS_BS_TIMESTAMPED ビットを設定することで、独自のタイムスタンプが必要であることを示します。

ライターは、バックアップされる各コンポーネントのタイムスタンプを格納できます。 ライターは、 IVssComponent::SetBackupStamp を呼び出し、 wszBackupStamp パラメーターのスタンプの文字列表現を渡すことによってタイムスタンプを格納します。 一般に、ライターは PostSnapshot イベントの処理中にこのメソッドを呼び出します。 ただし、シャドウ コピーを含まないバックアップの場合、PostSnapshot イベントは送信されません。 この場合、PrepareForBackup イベントの処理中に IVssComponent::SetBackupStamp を呼び出す必要があります。

増分バックアップまたは差分バックアップが実行されている場合、リクエスターは、このバックアップのベースとして機能している以前のバックアップのバックアップ スタンプをライターに示します。 ライターは、 IVssComponent::GetPreviousBackupStamp を呼び出すことによって、PrepareForBackup イベントまたは PostSnapshot イベントの処理中に、この以前のバックアップ スタンプにアクセスできます。 ライターは、返されたスタンプを使用して、バックアップする必要がある内容を決定できます。

バックアップ戦略

ファイル バックアップ ファイルの戦略

多くの場合、ライター メタデータで報告される特定のファイルは、特定の種類のバックアップを実行する場合にのみバックアップする必要があります。 一部のファイルは、完全バックアップを実行する場合にのみ必要な場合があります。 他のファイルは、増分バックアップまたは差分バックアップを実行する場合にのみ必要な場合があります。 VSS は、ライターがこの情報を要求者に示すメソッドを提供します。 IVssCreateWriterMetadata::AddDatabaseFilesIVssCreateWriterMetadata::AddDatabaseLogFiles、または IVssCreateWriterMetadata::AddFilesToFileGroup を使用してコンポーネントにファイルを追加する場合、dwBackupTypeMask パラメーターは、これらのファイルをバックアップする必要があるバックアップの種類を示します。 マスクには、次の値のうち 1 つ以上を含めることができます。

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 でした)。 ログ バックアップの場合、これは、このコンポーネント内のすべてのファイルを常にバックアップする必要があることを意味します。 ただし、完全バックアップの場合は、コンポーネントの選択性がバックアップする必要があることを意味するにもかかわらず、どのファイルもバックアップする必要はありません。

最終変更時刻によるバックアップ

ライターが変更されたファイルを示す 1 つの方法は、違うファイル メカニズムを使用することです。 ライターは、コンポーネント内の特定のファイルが特定の時点以降に変更された場合にのみバックアップするように指定できます。 ライターは、ファイル指定と最終変更時刻を使用して IVssComponent::AddDifferencedFilesByLastModifyTime を呼び出します。 IVssComponent::AddDifferencedFilesByLastModifyTime は通常、PostSnapshot イベントの処理中に呼び出されますが、PrepareForBackup イベントの処理中に呼び出すことができます。 その後、リクエスターは、指定された時刻以降に変更されたファイル仕様に一致するすべてのファイルをバックアップする必要があります。 ライターがバックアップ スタンプ メカニズムを使用している場合、この最後の変更時刻は、バックアップ ドキュメント内の以前のバックアップ スタンプに基づいて決定されます。 ライターは、最後の変更時刻に対して 0 を渡すこともできます。これは、要求元が最後のバックアップの時刻とその後に変更されたファイルを決定する役割を担っていることを示します。

ファイルの部分的なバックアップ

ライターがリクエスターに対する変更を示すもう 1 つの方法は、部分ファイル メカニズムを使用することです。 ライターは、バックアップする必要があるコンポーネント ファイル内のバイト範囲を指定できます。ライターは、PostSnapshot イベントまたは PrepareForBackup イベントの処理中に、これらのファイル範囲を指定できます。 ライターは IVssComponent::AddPartialFile を呼び出して、部分的なファイル仕様をバックアップに追加します。 部分的なファイル指定は、パスとファイル名と、バックアップする必要があるファイル内の範囲に関する情報で構成されます。

ファイル指定規則

IVssComponent::AddDifferencedFilesByLastModifyTime または IVssComponent::AddPartialFile は、Identify イベント中に指定されたファイル仕様を変更したり、完全に新しいファイルを仕様に追加したりするために使用できます。 ライターが IVssComponent::AddDifferencedFilesByLastModifyTime を使用して Identify イベント中に設定された情報を変更する場合、ファイル指定は現在のコンポーネントのファイル仕様のいずれかと完全に一致している必要があります。 ファイル指定は、現在のコンポーネント内のファイルを部分的に重複させてはなりません。また、他のコンポーネント内のファイルと一致してはなりません。 ただし、IVssComponent::AddPartialFile を使用して指定されたファイルは、別のファイル指定と部分的に重複する可能性があります。 IVssComponent::AddDifferencedFilesByLastModifyTime または IVssComponent::AddPartialFile によって設定された情報は、Identify イベントに応答して IVssCreateWriterMetadata インターフェイスを使用して前に設定した情報をオーバーライドします。

一般的なファイル仕様には、バックアップ時からファイルを取得する別の場所を示す代替場所の値 (IVssCreateWriterMetadata::AddFilesToFileGroupwszAlternateLocation パラメーターによって設定) を指定できます。 differenced-file または partial-file メカニズムを使用して設定されたファイル仕様が、別の場所を持つ既存のファイル仕様と一致する場合、バックアップ アプリケーションはこの代替の場所からデータを取得します。

IVssComponent::AddDifferencedFilesByLastModifyTime または IVssComponent::AddPartialFile で設定されたファイル仕様が一致しない場合、バックアップされるコンポーネント内のファイルと一致するすべてのファイルがバックアップに追加されます。 ライターは、この実行中に既にシャドウ コピーされているボリューム上に存在するファイルのみを追加することに注意する必要があります。そうしないと、リクエスターはこれらのファイルのバックアップに失敗する可能性があります。 PostSnapshot イベントの処理中にこれらの関数が呼び出される場合は、 CVssWriter::IsPathAffected メソッドを使用してこれを決定できます。 PrepareForBackup イベントの処理中に呼び出された場合、ライターは別のメソッドを使用してこの決定を行う必要があります。

シャドウ コピーを使用しないバックアップ

特定の種類のファイルをシャドウ コピー ボリュームからバックアップする必要がない場合があります。 たとえば、これは多くの場合、データベース ログ ファイルに当てはまります。 ログ ファイルは単調に拡張され、ライターは部分ファイルを使用してバックアップするファイルの部分を正確に指定できるため、多くの場合、元のボリュームからログをバックアップできます。 ライターは、最適化として、IVssCreateWriterMetadata::AddDatabaseFiles、IVssCreateWriterMetadata::AddDatabaseLogFiles、または IVssCreateWriterMetadata::AddFilesToFileGroupdwBackupTypeMask パラメーターに設定されたフラグを使用して、さまざまなバックアップの種類にシャドウ コピーを必要とするファイルをマークできます。 サポートされているフラグは次のとおりです。

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

すべてのバックアップの種類に必要なシャドウ コピー。これが既定値です。

特定のボリュームに、このバックアップにシャドウ コピーを必要としないコンポーネントのみが含まれている場合、リクエスターはこのボリュームのシャドウ コピーを作成する手順をスキップできます。 このボリューム上のすべてのデータは、元のボリュームから直接バックアップ メディアにコピーできます。

バックアップのクリーンアップ

ライターがログの切り捨てまたはその他のバックアップ後のクリーンアップを実行する必要がある場合は、 BackupComplete イベントの処理中にこれを行うのが適切な場所です。 BackupShutdown イベントは BackupComplete の後にしばらく送信されるため、BackupShutdown イベント ハンドラーでクリーンアップを行うこともできます。

BackupShutdown イベントは、バックアップの終了後に常に送信されます。 バックアップの実行中にリクエスターが異常終了した場合、BackupShutdown は、最初に BackupComplete を送信せずにすぐに送信されます。 ライターが状態をクリーンする必要がある場合は、ここで行うことができます。ただし、バックアップが必ずしも完了していないので、このイベントではログの切り捨てを行うべきではありません。

復元戦略

復元時のライターの基本的なタスクは、PreRestore イベントの処理で復元が発生すること、および PostRestore イベントの処理で復元が行われたかどうかを確認することです。 さらに複雑なストアでは、PostRestore ハンドラーで回復プロセスも実行されます。 復元が増分復元または差分復元の一部である場合、ライターは通常、すべての増分復元または差分復元が完了するまで、この回復プロセスを遅延させる必要があります。 IVssComponent::GetAdditionalRestores は、これがこのコンポーネントの最終的な復元かどうか、または今後の復元が追加されるかどうかを示します。 IVssComponent::GetAdditionalRestorestrue を返す場合、ライターはそのコンポーネントに対して回復手順を実行しないでください。

新しいターゲット

ライターでサポートされている場合、リクエスターは元のバックアップ時の場所以外の場所にデータ ファイルを復元できます。 ライターは、IVssCreateWriterMetadata::SetBackupSchema を呼び出すときに dsSchemaMask パラメーターにVSS_BS_WRITER_SUPPORTS_NEW_TARGET ビットを設定することで、この復元モードのサポートを示します。 ライターは、IVssComponent::GetNewTargetCount と IVssComponent::GetNewTarget を呼び出すことによって、復元時にコンポーネント ファイルの新しい場所を取得します。

指示対象

複雑な復元シナリオの場合、ライターは、バックアップされたファイルの範囲を同じファイルまたは別のファイルの異なる範囲にマップする必要がある場合があります。 これは、ダイレクト ターゲット メカニズムを使用して行うことができます。 これを行うには、ライターはまず、IVssComponent::SetRestoreTarget を呼び出し、ターゲット パラメーターのVSS_RT_DIRECTEDを渡すことによってこれが発生することを示す必要があります。 次に、マッピングごとに、ライターは IVssComponent::AddDirectedTarget を呼び出します。 このメソッドは、バックアップ上のソース ファイルへの完全パスと、復元先のファイルへの完全パスを受け取ります。 また、これらの各ファイルの範囲リストも受け取ります。 ライターは PreRestore イベントの処理中にこれらの関数を呼び出し、リクエスターはソース ファイル内の指定された範囲をコピー先ファイル内のマップされた範囲に復元する役割を担います。 範囲文字列の形式は、IVssComponent::AddPartialFile と同じです

Private Writer メタデータ

多くの場合、ライターは、増分復元または差分復元を適切に実行するために、バックアップを使用してプライベート メタデータを維持すると便利です。 ライターは、PrepareForBackup または PostSnapshot を処理してメタデータを格納するときに 、IVssComponent::SetBackupMetadata を呼び出す場合があります。 このメタデータは、 IVssComponent::GetBackupMetadata を呼び出すことによって、PreRestore または PostRestore の間にライターによってアクセスできます。 メタデータは、IVssComponent::AddPartialFilewszMetadata パラメーターを使用して、部分的なファイル指定と共に格納することもできます。このメタデータには、IVssComponent::GetPartialFilepbstrMetadataパラメーターを使用してアクセスします。 ライターは、CVssWriter::OnPreRestore と CVssWriter::OnPostRestore の間でメタデータをそれ自体に渡すこともできます。 CVssWriter::OnPreRestore では、メタデータは IVssComponent::SetRestoreMetadata を呼び出すことによって設定されます。 CVssWriter::OnPostRestore では、IVssComponent::GetRestoreMetadata を呼び出すことによってメタデータが取得されます。