マージ レプリケーションによるパブリケーションとサブスクリプションの初期化方法

マージ レプリケーションでは、パブリッシャとサブスクライバ間でデータ フローが発生する前に、それぞれを初期化する必要があります。このトピックでは、初期化の際に実行する手順について説明します。

パブリケーションの初期化

以下に、パブリケーションの初期化手順を詳しく説明します。初期化は、記載されている各ストアド プロシージャを実行したときや、パブリケーションの新規作成ウィザードを終了したときに行われます。また、パブリケーションに対してスナップショット エージェントを最初に実行したときにも、さらに初期化が行われます。

  • sp_replicationdboption

    • パブリケーション データベースがレプリケーション用にマークされます。レプリケーションが削除されるまでは、データベースを削除できません。

    • システム テーブルがパブリケーション データベースに追加されます (データベース中に既にマージ パブリケーションがある場合を除く)。システム テーブルの完全な一覧については、このトピックの「パブリケーション データベースとサブスクリプション データベース中に作成されるシステム テーブル」を参照してください。

  • sp_addmergepublication

    • パブリケーション用のエントリがシステム テーブルに追加されます。
  • sp_addpublication_snapshot

    • スナップショット エージェント ジョブが SQL Server エージェント システムに追加されます。ジョブ名の形式は、<Publisher>-<PublicationDatabase>-<Publication>-<Integer> です。
  • sp_addmergearticle

    • レプリケートされた各オブジェクトがレプリケーション用にマークされます。対応するアーティクルがすべてのパブリケーションから削除されるまでは、オブジェクトを削除できません。

    • 各アーティクル用のエントリがシステム テーブルに追加されます。

パブリケーション データベースの残りの初期化処理は、パブリケーションに対して最初にスナップショット エージェントを実行したときに行われます (それ以降にスナップショット エージェントを実行しても、パブリケーション データベースは再初期化されません)。パブリケーションの新規作成ウィザードを使用すると、既定では、ウィザードを終了した後で初期スナップショットが作成されます。ストアド プロシージャを使用する場合には、エージェント ジョブまたはエージェントを直接実行する必要があります。エージェントの実行の詳細については、「レプリケーション エージェントの起動および停止方法 (SQL Server Management Studio)」および「レプリケーション エージェント実行可能ファイルの概念」を参照してください。

パブリケーションに対してスナップショット エージェントを最初に実行すると、次の処理が行われます。

  • ROWGUIDCOL プロパティが設定され、データ型が uniqueidentifier の列がまだテーブルになければ、パブリッシュされた各テーブルに rowguid という列が追加されます (該当する列がある場合は、その列が使用されます)。rowguid 列は、パブリッシュされたすべてのテーブルのすべての列を一意に識別するために使用されます。テーブルがパブリケーションから削除されると、rowguid 列も削除されます。既存の列を追跡に使用していた場合は、その列は削除されません。

  • パブリケーション データベース内のパブリッシュされた各テーブルに、次のオブジェクトが作成されます (すべてのオブジェクトは dbo スキーマで作成されます)。

    • INSERT トリガ、UPDATE トリガ、DELETE トリガが、変更を追跡するために、パブリッシュされたテーブルに追加されます。トリガの名前の形式は、MSmerge_ins_<GUID>MSmerge_upd_<GUID>、および MSmerge_del_<GUID> です。GUID 値は、システム テーブル sysmergearticles 内のアーティクルのエントリから派生したものです。

    • パブリッシュされたテーブルへの挿入、更新、および削除を処理し、レプリケーション関連の各種の操作を行うために、ストアド プロシージャが作成されます。

    • 挿入、更新、削除、およびフィルタ選択を管理するために、ビューが作成されます。

    • 競合情報を格納するために競合テーブルが作成されます。競合テーブルは、パブリッシュされたテーブルのスキーマに一致します。パブリッシュされた各テーブルに対するスクリプトが作成され、スクリプトを使用してパブリケーション データベース内に競合テーブルが作成されます。競合テーブルの名前の形式は、dbo.MSmerge_conflict_<Publication>_<Article> です。

スナップショット エージェントが実行されるたびに、パブリケーション データベース内の各アーティクルに対して次の種類のファイルが、次のファイル拡張子で作成されます。

  • スキーマ (.sch)

  • 制約とインデックス (.dri)

  • トリガ (.trg)

  • システム テーブル データ (.sys)

  • 競合テーブル (.cft)

  • データ (.bcp) -- パラメータ化されたフィルタを使用したパブリケーションでは作成されません。

    パラメータ化されたフィルタが使用されないパブリケーションの場合、スナップショットはパブリッシュされたテーブルのデータを一連の .bcp ファイルに格納します。パラメータ化されたフィルタが使用されるパブリケーション (マージ パブリケーションで一般的) の場合、初期スナップショットにはデータが含まれません。データは、サブスクライバのパーティションのスナップショットを使用して提供されます。これについては、次の「サブスクリプションの初期化」で説明します。

サブスクリプションの初期化

各サブスクリプションに対するマージ エージェントが実行されると、サブスクリプションが初期化され、初期スナップショットがサブスクリプション データベースにコピーされます。スナップショットには、レプリケートされるオブジェクトのスキーマおよびデータに加え、パブリケーション データベース中に存在するシステム テーブル、ビュー、トリガ、およびストアド プロシージャが含まれます (サブスクリプション データベースには、1 つまたは 2 つのシステム テーブルが追加でコピーされます)。システム テーブルの完全な一覧については、このトピックの「パブリケーション データベースとサブスクリプション データベース中に作成されるシステム テーブル」を参照してください。サブスクリプションが再初期化されると、レプリケートされたすべてのオブジェクトとレプリケーション システム オブジェクトが上書きされます。

パブリケーション データベース内のどのテーブルもパラメータ化されたフィルタを使用していない場合は、同じパブリケーション スナップショットが各サブスクライバにコピーされます。パラメータ化されたフィルタが 1 つ以上使用されている場合は、各サブスクリプションの初期化方法は次のようにして決まります。

  • スナップショットの場所をコマンド ラインでマージ エージェントに指定した場合

    • この場所からスナップショットが適用されます。
  • 上記に該当せず、スナップショットが生成済みの場合

    • スナップショットの場所が、パブリケーション データベースの MSmerge_dynamic_snapshots から取得され、その場所からスナップショットが適用されます。
  • 上記に該当せず、パブリケーションによりサブスクライバにスナップショットの開始が許可されている場合

    • 同じパーティションの他のサブスクライバ用にスナップショットが既に生成されている場合は、そのスナップショットがサブスクライバに適用されます。

    • スナップショットが生成されていない場合は、スナップショットが生成されてサブスクライバに適用されます。

  • 上記のいずれにも該当しない場合は、パブリケーション内のテーブルに対して SELECT ステートメントが実行され、サブスクライバが初期化されます。この方法は、サブスクライバのパーティションのスナップショットを使用するよりもかなり遅くなります。

ある時点でスナップショットの転送が中断された場合、転送は自動的に再開され、既に転送が完了したファイルは再送されません。スナップショット エージェントの配信単位は、各パブリケーション アーティクルに対する bcp ファイルであるため、部分的に配信されたファイルは再度全体を配信する必要があります。しかし、スナップショットの再開機能を使うことで、転送されるデータ量が大幅に削減され、接続が不安定な場合でもタイムリーにスナップショットを配信できます。スナップショットの作成の詳細については、「パラメータ化されたフィルタを使用したマージ パブリケーションのスナップショット」を参照してください。

スナップショットの場所

スナップショットの場所は、既定または代替のスナップショットの場所として指定されたパス、パブリケーションでスナップショット フォルダに UNC パスまたは FTP 共有を使用しているかどうか、および、パラメータ化されたフィルタが使用されているかどうかで決まります。次の例では、スナップショット フォルダの場所を \\<MyComputer>\<MyFolder>\ としています。

  • パブリケーションで UNC を使用する場合、パスの最初の部分は \\<MyComputer>\<MyFolder>\unc\ です。FTP を使用する場合は、\\<MyComputer>\<MyFolder>\ftp\ です。

  • パブリケーションで UNC を使用し、パラメータ化されたフィルタを使用しない場合、パスは \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication> です。

  • パブリケーションで UNC を使用し、パラメータ化されたフィルタを使用する場合は、場所はスナップショット フォルダのパスおよびパブリケーションのパラメータ化された行をフィルタ選択する基準で決まります。たとえば、アーティクルを HOST_NAME() 関数でフィルタ選択し、パーティションの HOST_NAME() の値が SalesLaptop の場合、そのパーティションのスナップショットのパスは \\<MyComputer>\<MyFolder>\unc\<Publisher><Publicationdb><publication>\ SalesLaptop_12\ となります。ここで、12 はパーティションに対して内部的に使用される ID です。

パブリケーション データベースとサブスクリプション データベース中に作成されるシステム テーブル

パブリケーション データベースと各サブスクリプション データベースには、次のテーブルが作成されます。

テーブル

説明

MSdynamicsnapshotjobs (Transact-SQL)

パラメータ化されたフィルタを使用するパブリケーションのスナップショット ジョブの情報が格納されています。

MSdynamicsnapshotviews (Transact-SQL)

スナップショット エージェントによって作成された、一時的なスナップショット ビューをすべて追跡します。このテーブルは、SQL Server エージェントまたはスナップショット エージェントが異常終了した場合に、ビューをクリーンアップするためにシステムで使用されます。

MSmerge_altsyncpartners (Transact-SQL)

パブリッシャの現在の同期パートナーとの関係を追跡します。

MSmerge_articlehistory (Transact-SQL)

マージ エージェントの同期セッション中のアーティクルに対する変更を追跡します。変更される各アーティクルに対し、1 行のデータが使用されます。

MSmerge_conflicts_info (Transact-SQL)

サブスクリプションをマージ パブリケーションに同期する際に発生する競合を追跡します。

MSmerge_contents (Transact-SQL)

パブリッシュ以降に現在のデータベースで変更された行ごとに 1 行のデータを保持します。このテーブルは、変更された行を判断するためにマージ処理で使用されます。

MSmerge_current_partition_mappings

変更された行が属するパーティションごとに 1 行のデータを保持します。

MSmerge_dynamic_snapshots (Transact-SQL)

マージ パブリケーションで定義されている各パーティションのスナップショットの場所を追跡します。

MSmerge_errorlineage (Transact-SQL)

サブスクライバで削除されたが、その削除がパブリッシャに反映されていない行を保持します。

MSmerge_generation_partition_mappings (Transact-SQL)

指定のパーティションに関連する変更が生成結果に含まれているかどうかを追跡します。

MSmerge_genhistory (Transact-SQL)

生成結果ごとに 1 行のデータを保持します。生成結果は、パブリッシャまたはサブスクライバに配信される変更の集まりです。生成結果はマージ エージェントが実行されるたびに閉じられます。データベースでのその後の変更は、1 つ以上の開いている生成結果に追加されます。

MSmerge_history (Transact-SQL)

以前のマージ エージェント ジョブ セッションの結果に関する詳細な説明が含まれる履歴行を保持します。

MSmerge_identity_range (Transact-SQL)

パブリケーションへのサブスクリプションの ID 列に割り当てられている数値範囲を追跡します。この割り当てられた範囲は、レプリケーションによって自動的に管理されています。

MSmerge_metadataaction_request (Transact-SQL)

必要な各補正アクションに対して 1 つの行を保持します。補正アクションは、あるノードでの変更を、他のノードで変更に失敗した場合に、ロールバックするために使用されます。

MSmerge_partition_groups (Transact-SQL)

特定のデータベース中の事前計算済みパーティションごとに 1 行のデータを保持します。

MSmerge_past_partition_mappings (Transact-SQL)

変更された行が以前は属していたが、現在では属していないパーティションごとに 1 行のデータを保持します。

MSmerge_replinfo (Transact-SQL)

サブスクリプションごとに 1 行のデータを保持します。このテーブルは、送受信された生成結果に関する内部情報を追跡します。

MSmerge_sessions (Transact-SQL)

以前のマージ エージェント ジョブ セッションの結果が含まれる履歴行を保持します。

MSmerge_settingshistory (Transact-SQL)

アーティクルおよびパブリケーション プロパティに対する変更の履歴を、変更ごとに 1 行のデータで保持します。

MSmerge_tombstone (Transact-SQL)

削除された行の情報を保持します。この削除は他のサブスクライバに反映されます。

MSrepl_errors (Transact-SQL)

エージェントの障害に関する詳細な情報を保持します。

sysmergearticles (Transact-SQL)

マージ アーティクルごとに 1 行のデータを保持します。

sysmergepartitioninfo (Transact-SQL)

各アーティクルのパーティションに関する情報を、アーティクルごとに 1 行のデータで保持します。

sysmergepartitioninfoview (Transact-SQL)

テーブル アーティクルのパーティション分割情報を保持します。

sysmergepublications (Transact-SQL)

マージ パブリケーションごとに 1 行のデータを保持します。

sysmergeschemaarticles (Transact-SQL)

ストアド プロシージャなどの、スキーマ専用のアーティクルを追跡します。

sysmergeschemachange (Transact-SQL)

スナップショット エージェントが生成した、パブリッシュされたアーティクルに関する情報を保持します。

sysmergesubscriptions (Transact-SQL)

サブスクライバごとに 1 行のデータを保持します。

sysmergesubsetfilters (Transact-SQL)

パーティション分割されたアーティクルの結合フィルタ情報を保持します。

また、各サブスクリプション データベースには MSsnapshotdeliveryprogress テーブルが作成され、プル サブスクリプションを使用する各サブスクリプション データベースに MSsubscription_properties テーブルが作成されます。

テーブル

説明

MSsnapshotdeliveryprogress (Transact-SQL)

スナップショットを適用する際に、サブスクライバに正しく配信されたファイルを追跡します。このデータは、マージ エージェントがセッション中にすべてのファイルを配信できなかった場合に、ファイルの配信を再開するために使用されます。

MSsubscription_properties (Transact-SQL)

サブスクライバでレプリケーション エージェントを実行するために必要なパラメータ情報を保持します。