スナップショットを使用しないトランザクション サブスクリプションの初期化

トランザクション パブリケーションへのサブスクリプションは、既定ではスナップショットを使用して初期化されます。このスナップショットはスナップショット エージェントによって生成され、ディストリビューション エージェントによって適用されます。初期データセットが大規模な場合など、状況によっては、別の方法でサブスクリプションを初期化するのが望ましい場合があります。サブスクライバを初期化する他の方法としては、以下のものがあります。

  • バックアップを指定する方法。サブスクライバ上でバックアップを復元してから、ディストリビューション エージェントにより、必要なレプリケーション メタデータとシステム プロシージャがコピーされます。バックアップを使用した初期化は、サブスクライバにデータを配信する最も高速な方法であり便利です。バックアップを使用した初期化をパブリケーションで有効にした後で取得したバックアップであれば、どのバックアップでも使用できます。

  • データベースのアタッチなど、他の手法で初期データセットをサブスクライバにコピーする方法。正しいデータとスキーマがサブスクライバにあることを確認してから、ディストリビューション エージェントにより、必要なメタデータとシステム プロシージャがコピーされます。

バックアップを使用したサブスクリプションの初期化

バックアップにはデータベース全体が含まれるため、各サブスクリプション データベースを初期化した後は、パブリケーション データベースの完全なコピーが含まれます。

  • バックアップには、パブリケーションでアーティクルとして指定されていないテーブルが含まれます。

  • バックアップには、テーブルに対して行フィルタや列フィルタが指定してある場合でも、すべてのデータが含まれます。

バックアップを復元した後に不要なオブジェクトやデータを削除するのは、管理者またはアプリケーションの責任です。以降の同期では、アーティクルとして指定されたテーブルに該当するデータの変更と、指定したフィルタ条件に一致した変更だけがレプリケートされます。

注意注意

バックアップを復元する際、サブスクライバを使用して自動的に同期させる場合には、そのバックアップがパブリッシャのものであることを確認する必要があります。同期を開始する位置の設定に使用する、バックアップ内のログ シーケンス番号 (LSN) の値は、パブリッシャに固有です。

バックアップを使用してサブスクリプションを初期化するには

バックアップを使用してサブスクリプションを初期化するには、まずパブリケーションを作成する際にオプションを有効にし、さらにサブスクリプションを作成する際にいくつかのオプションに値を指定する必要があります。パブリケーションは、パブリケーションの新規作成ウィザードかプログラムで有効にできます。ただし、サブスクリプション オプションで必要な値は、プログラムでしか指定できません。

注意注意

スナップショットを使用せずにサブスクリプションを初期化する場合、パブリッシャで SQL Server サービスを実行する際に使用されるアカウントには、ディストリビュータのスナップショット フォルダに対する書き込み権限が必要です。権限の詳細については、「レプリケーション エージェントのセキュリティ モデル」を参照してください。

バックアップの適合性の確認

バックアップがサブスクライバの初期化に適しているのは、バックアップの取得後に実行されたすべてのトランザクションがディストリビュータに保存されている場合です。バックアップが適していない場合には、レプリケーションでエラー メッセージが表示されます。

バックアップが使用に適したものになるように、次のガイドラインに従ってください。

  • 利用できる最新のバックアップを使用してください。最新のバックアップがディストリビューションの最長保有期間より古い場合には、バックアップを使用してサブスクリプションを初期化する前に、新しいバックアップを作成してください。保有期間の詳細については、「サブスクリプションの有効期限と非アクティブ化」を参照してください。

  • 既定では、ディストリビューション クリーンアップ ジョブにより、72 時間よりも古いトランザクションがディストリビューション データベースから削除されます。クリーンアップは、パブリケーションで設定された保有期間に基づきます。古いバックアップを使用して同期する場合は、バックアップを復元する前にジョブを一時的に無効にし、サブスクリプションが正常に作成された後で再度有効にすることを検討してください。これにより、バックアップから正常に同期するために必要となるトランザクションが、ディストリビューション データベースから削除されることを防ぐことができます。クリーンアップ ジョブの実行の詳細については、「レプリケーション メンテナンス ジョブを実行する方法 (SQL Server Management Studio)」を参照してください。

場合によっては、バックアップを使用してサブスクリプションを初期化した後で、復元したサブスクライバ データベースを手動でカスタマイズする必要があります。一般に、復元したサブスクライバ データベースを手動で変更する必要があるのは、サブスクライバ データベースの内容がパブリッシャ データベースの内容と異なるようにパブリケーションが定義されている場合です。

  • 復元されたデータベースのインデックス付きビューが、ログに基づくテーブルへのインデックス付きビューのアーティクルとしてパブリッシュされている場合は、テーブルに変換する必要があります。

  • 復元したデータベースでサブスクライブされた timestamp 列は、binary(8) 列に変換する必要があります。そのためにまず、timestamp 列を含むテーブルの内容を新しいテーブル (ほぼ同じスキーマで、timestamp 列の代わりに binary(8) 列を使用したテーブル) にコピーしてください。次に、元のテーブルを削除し、新しいテーブルを元のテーブルと同じ名前に変更してください。

代替手段を使用したサブスクリプションの初期化

Integration Services のように、パブリケーション データベースのスキーマとデータをサブスクライバにコピーできる方法であれば、任意の方法を使ってサブスクリプションを初期化することができます。代替手段を使用してサブスクライバを初期化すると、レプリケーション サポート オブジェクトはサブスクライバにコピーされます。

バックアップを使用して初期化する場合と違い、サブスクリプションを追加した時点でデータとスキーマが正しく同期されていることを手動またはアプリケーションで確認する必要があります。たとえば、データとスキーマをサブスクライバにコピーしてからサブスクリプションを追加するまでの間にパブリッシャ上で処理が実行されると、この処理による変更がサブスクライバにレプリケートされない場合があります。

代替手段を使用してサブスクリプションを初期化するには