データベース スナップショットのプログラムによる管理
最終更新日: 2010年2月16日
適用対象: SharePoint Foundation 2010
このトピックでは、データベースのスナップショットをバックアップおよびデータ復元のカスタム ソリューションに組み込む方法について説明します。
データベース スナップショット管理
Microsoft SharePoint Foundation サーバー ファームで Microsoft SQL Server の Enterprise Edition または Developer Edition を使用している場合、ファーム管理者はこれらのエディションのスナップショット機能を利用できます。スナップショットは SQL Server で管理できますが、タイマー ジョブ (SPTimerService および SPJobDefinition) と組み合わせてスナップショットを管理できる一連のクラスも SharePoint Foundation API に用意されています。ソリューションでは、各スナップショットを作成する頻度、自動的に削除するまでスナップショットを保持する期間、および一度に保持するスナップショットの最大数をプログラムによって決定することができます。
注意
SQL Server スナップショットは、実際にはデータベース全体のコピーではありません。初期状態のスナップショットは空です。データが元のデータベースに書き込まれるたびに、前の値がスナップショットに書き込まれます。スナップショットがアクセスされると、SQL Server はスナップショットだけでなく元のデータベース内の未変更データも含め、これらを 1 つのデータベースであるかのように処理します。したがって、スナップショットを元のデータベース内の未変更データと組み合わせたものが、実質的にはスナップショット作成時のデータベースのレコードです。詳細については、「Database Snapshots」を参照してください。
カスタム データベースをスナップショットから復元可能にする
自社の SharePoint Foundation ソリューションで、SQL Server の Enterprise Edition または Developer Edition によってホストされる補助データベースを使用する場合、IDatabaseSnapshotRestore インターフェイスを実装してこのデータベースを表すクラスを設計することで、データベースを SharePoint Foundation インフラストラクチャに取り入れることができます。これを行う詳細な方法については、「[方法] スナップショットから復元できるデータベース クラスを作成する」を参照してください。
スナップショット管理 API
スナップショット管理用の 2 つの重要なクラスが、SharePoint Foundation オブジェクト モデルに用意されています。これらについて、以下に詳細を説明します。
SPDatabaseSnapshot
この型のオブジェクトは、スナップショットを表します。このオブジェクトは、SPDatabaseSnapshotCollection コレクションのメンバーとしてのみ存在し、このコレクションそれ自体は SPDatabase.Snapshots プロパティの値としてのみ存在します。SPDatabaseSnapshot クラスの主要なメンバーの概要を以下に示します。詳細については、各メンバー (およびこのクラスのその他のメンバー) のリファレンス トピックを参照してください。
Delete() – 名前からわかるとおり、このメソッドはスナップショットを削除します。状況に応じて呼び出すこともできますが、通常はタイマー ジョブから呼び出され、スナップショットが最大保持期間 (MaximumRetention) に達したかどうか、またはスナップショットの最大数 (SnapshotLimit) に達したときに特定のスナップショットがそのデータベースの最も古いスナップショットかどうかを定期的にチェックする場合に使用されます。
Restore() – このメソッドは、データベースをスナップショットで上書きしてから、そのデータベースのすべての既存のスナップショットを削除します。メソッドのオーバーロードの 1 つには、データベースが IDatabaseSnapshotRestore を実装しない場合でも上書きを強制実行するオプションを提供する呼び出しコードが含まれます。
SPDatabaseSnapshotCollection
SPDatabaseSnapshotCollection クラスの主要なメンバーの概要を以下に示します。詳細については、各メンバー (およびこのクラスのその他のメンバー) のリファレンス トピックを参照してください
CreateSnapshot() – このメソッドを呼び出すと、SQL Server でスナップショットが作成されます。それ以降にデータベースに対して書き込み操作を行うと、データベース サーバーによって元の値がスナップショットに書き込まれます。また、このメソッドは、EnabledManagement を true に設定します。
DeleteSnapshots()- このメソッドは、データベースのすべての既存のスナップショットを削除します。
RefreshSnapshots() – このメソッドは、スナップショットに従って SharePoint Foundation コンテンツ データベースと構成データベースを同期して、コンテンツ データベースに関連して SQL Server 内に実際に存在するすべてのスナップショットのみを構成データベースに登録します。一般的に、なんらかの理由からインデクサー "sfdb.Snapshots[0]" (ここで sfdb は SPDatabase オブジェクト) などを使用してコードでスナップショットにアクセスする直前に、このメソッドを呼び出す必要があります。ただし、CreateSnapshot() メソッドと DeleteSnapshots() メソッドは、RefreshSnapshots() を呼び出します。
EnabledManagement – このプロパティが true の場合、スナップショットを管理する SharePoint Foundation 組み込みタイマー サービス ジョブは、親データベースを管理対象に含めます。たとえば、一般にジョブはデータベースのスナップショットの作成および削除を指定された間隔で行います。プロパティが false の場合、このようなジョブは親データベースを無視します。特定のデータベースに対する独自のスナップショット管理タイマー ジョブを SharePoint Foundation ソリューションで使用するには、対象のデータベースの EnabledManagement を false に設定する必要があります。これを行わないと、同じデータベースのスナップショットを作成および削除する 2 組のタイマー ジョブが干渉し合うことになります。CreateSnapshot() メソッドは、このプロパティを true に設定します。
CreationInterval – このプロパティは、親データベースの新しいスナップショットを作成する間隔を時単位で指定します。
MaximumRetention- このプロパティは、スナップショットを削除するまで保持する時間を時単位で指定します。
SnapshotLimit – このプロパティは、親データベースに対して同時に存在できるスナップショットの最大数を指定します。
データベースのスナップショット管理を構成する
SharePoint Foundation に付属する組み込みのスナップショット管理タイマー ジョブで管理されるようにデータベースを設定するには、次の操作を行うコードを実行します。
EnabledManagement プロパティを true に設定します。
CreationInterval、MaximumRetention、および SnapshotLimit プロパティの値を設定します。
SPDatabaseSnapshotCollection オブジェクトの UpdateParent() メソッドを呼び出します。
カスタム スナップショット管理タイマー ジョブによる管理をデータベースに設定する場合は、EnabledManagement プロパティを false に設定することを除き、これと同じ手順を行います。
スナップショットから復元する
スナップショットからデータベースをプログラムによって復元する主な手順は、次のとおりです。
データベースを表す SPDatabase オブジェクトへの参照を取得します。
RefreshSnapshots() を呼び出して、データベースに対応する現在の一連のスナップショットが操作の対象となるようにします。たとえば、"sfdb.Snapshots.RefreshSnapshots();" (ここで sfdb は SPDatabase オブジェクトへの参照) と記述します。
復元に使用するスナップショットへの参照を取得します。たとえば、最新のスナップショットへの参照を取得するには、次のコードを使用できます。
Int32 numberOfSnapshots = sfdb.Snapshots.Count; SPDatabaseSnapshot spDBSnapshot = sfdb.Snapshots[numberOfSnapshots-1];
Dim numberOfSnapshots As Int32 = sfdb.Snapshots.Count Dim spDBSnapshot As SPDatabaseSnapshot = sfdb.Snapshots(numberOfSnapshots-1)
Restore() メソッドの 1 つをスナップショットに対して呼び出します。以下に例を示します。
spDBSnapshot.Restore();
spDBSnapshot.Restore()
独自のスナップショット管理タイマー ジョブを実装する
SharePoint Foundation オブジェクト モデルを使用してカスタム スナップショット管理アプリケーションを開発する場合、独自のクラスを SPJobDefinition クラスから派生させることができます。主な作業は、Execute(Guid) メソッドのオーバーライドを作成することです。一般に、このメソッドでは次の操作を行います。
データベースをホストする SPDatabaseServiceInstance オブジェクトへの参照を取得します。
オブジェクトの Databases プロパティのすべてのメンバーに対して、次の操作を反復処理します。
sfdb.Snapshots.EnabledManagement (ここで sfdb は SPDatabase オブジェクトへの参照) の値をチェックし、値が true であれば何もしません (値が true の場合、SharePoint Foundation の組み込みスナップショット管理タイマー ジョブがデータベースのスナップショットを管理します)。
他の各データベースについて RefreshSnapshots() を呼び出してスナップショットの一覧を最新の状態に更新してから、MaximumRetention プロパティの値よりも Age の値が大きいスナップショットを削除します。
RefreshSnapshots() を再度呼び出してから、最新のスナップショットの保持期間 (sfdb.Snapshots[sfdb.Snapshots.Count-1].Age) を CreationInterval の値と比較します。同じ値であるか、前者が後者よりも大きければ、CreateSnapshot() を呼び出して新しいスナップショットを作成します。
RefreshSnapshots() を再度呼び出してから、スナップショットの総数が SnapshotLimit よりも大きいかどうかをチェックします。大きければ、上限値以下になるまでスナップショットを削除します。最も古いスナップショット (sfdb.Snapshots[0]) を最初に削除してから、次に古いスナップショット (sfdb.Snapshots[1]) を削除し、以降もこれを繰り返します。