スナップショット レプリケーションの動作方法

既定では、3 種類のレプリケーションすべてでスナップショットを使用してサブスクライバが初期化されます。SQL Server スナップショット エージェントは、必ずスナップショット ファイルを生成しますが、ファイルを配信するエージェントは、使用するレプリケーションの種類によって異なります。スナップショット レプリケーションとトランザクション レプリケーションでは、ディストリビューション エージェントを使用してファイルが配信されますが、マージ レプリケーションでは、SQL Server マージ エージェントが使用されます。スナップショット エージェントはディストリビュータ側で実行されます。ディストリビューション エージェントとマージ エージェントは、プッシュ サブスクリプションの場合はディストリビュータ側で、プル サブスクリプションの場合はサブスクライバ側で実行されます。プッシュ サブスクリプションとプル サブスクリプションの詳細については、「パブリケーションのサブスクライブ」を参照してください。エージェントの詳細については、「レプリケーション エージェントの概要」を参照してください。

スナップショットは、サブスクリプションの作成直後、またはパブリケーションの作成時に設定したスケジュールに従って生成および適用できます。スナップショット エージェントは、パブリッシュされたテーブルやデータベース オブジェクトのスキーマとデータを含むスナップショット ファイルを作成し、ファイルをパブリッシャのスナップショット フォルダに格納して、追跡情報をディストリビュータのディストリビューション データベースに記録します。ディストリビュータを構成する際に既定のスナップショットフォルダを指定しますが、既定のフォルダを代替または追加する場所として、パブリケーションに対して代替位置を指定できます。詳細については、「スナップショット フォルダの代替位置」を参照してください。

注意注意

このトピックで説明する標準のスナップショット処理の他に、パラメータ化されたフィルタを使用したマージ パブリケーションでは、2 段階のスナップショット処理が使用されます。詳細については、「パラメータ化されたフィルタを使用したマージ パブリケーションのスナップショット」を参照してください。

次の図に、スナップショット レプリケーションの主要なコンポーネントを示します。

スナップショット レプリケーション コンポーネントとデータ フロー

スナップショット エージェント

マージ レプリケーションの場合は、スナップショット エージェントが起動するたびにスナップショットが生成されます。トランザクション レプリケーションでは、スナップショットの生成は、パブリケーション プロパティ immediate_sync の設定で決まります。プロパティが TRUE に設定されていると (パブリケーションの新規作成ウィザードを使用する際の既定の設定)、スナップショット エージェントを実行するたびにスナップショットが生成され、いつでもスナップショットをサブスクライバに適用できます。プロパティが FALSE に設定されていると (sp_addpublication を使用する場合の既定の設定)、最後にスナップショット エージェントを実行してから新しいサブスクリプションが追加された場合にだけスナップショットが生成されます。サブスクライバは、スナップショット エージェントが完了するまで同期することはできません。

スナップショット エージェントは以下の手順を実行します。

  1. ディストリビュータからパブリッシャへの接続を確立し、必要に応じてパブリッシュされたテーブルのロックを設定します。

    • マージ パブリケーションの場合、スナップショット エージェントはロックを設定しません。

    • トランザクション パブリケーションの場合、既定では、スナップショット生成の初期フェーズの間だけロックを設定します。

    • スナップショット パブリケーションの場合は、スナップショット生成処理の間中ロックが保持されます。

  2. 各アーティクルに対するテーブル スキーマのコピーを .sch ファイルに書き込みます。インデックス、制約、ストアド プロシージャ、ビュー、ユーザー定義関数などの他のデータベース オブジェクトがパブリッシュされている場合は、追加のスクリプト ファイルが生成されます。

  3. パブリッシュされたテーブルのデータをパブリッシャでコピーし、スナップショット フォルダにデータを書き込みます。スナップショットは、一連の一括コピー プログラム (BCP) ファイルとして生成されます。

  4. スナップショット パブリケーションとトランザクション パブリケーションの場合、ディストリビューション データベース内の MSrepl_commands テーブルと MSrepl_transactions テーブルに行を追加します。MSrepl_commands テーブル中のエントリは、.sch ファイルと .bcp ファイル、その他のスナップショット ファイルの場所を示すコマンドと、スナップショットの作成前後に実行するスクリプトへの参照です。MSrepl_transactions テーブル内のエントリは、サブスクライバの同期に関連するコマンドです。

    マージ パブリケーションの場合は、スナップショット エージェントで実行する手順が追加されます。詳細については、「マージ レプリケーションによるパブリケーションとサブスクリプションの初期化方法」を参照してください。

  5. パブリッシュされたテーブルのすべてのロックを解放します。

スナップショットの生成中に、パブリッシュされたテーブルのスキーマを変更しないでください。スナップショット ファイルが生成されると、Windows エクスプローラを使用して、スナップショット フォルダにあるそれらのファイルを参照できます。

ディストリビューション エージェントとマージ エージェント

スナップショット パブリケーションの場合、そのパブリケーションに対してディストリビューション エージェントが起動するたびに、まだ同期されておらず、再初期化のマークが付いているか新しいアーティクルを含む各サブスクライバへ、新しいスナップショットを移動します。

スナップショット レプリケーションとトランザクション レプリケーションの場合、ディストリビューション エージェントは以下の手順を実行します。

  1. ディストリビュータへの接続を確立します。

  2. ディストリビュータのディストリビューション データベースにある MSrepl_commands テーブルと MSrepl_transactions テーブルを調査します。最初のテーブルからスナップショット ファイルの位置を読み取り、両方のテーブルからサブスクライバ同期コマンドを読み取ります。

  3. スキーマとコマンドをサブスクリプション データベースに適用します。

フィルタ選択されていないマージ レプリケーション パブリケーションの場合、マージ エージェントは以下の手順を実行します。

  1. パブリッシャへの接続を確立します。

  2. パブリッシャ上の sysmergeschemachange テーブルを調べ、サブスクライバで適用する必要のある新しいスナップショットがあるかどうかを判断します。

  3. 新しいスナップショットを利用できる場合、sysmergeschemachange で指定された位置のスナップショット ファイルをサブスクリプション データベースに適用します。