雰囲気でレプリケーションを使用していたので気づいていたなかったのですが、レプリケーションに対してアーティクルの追加を実施する場合、レプリケーションの作成時に考慮しておいた方が良い点がありますのでメモとして。
レプリケーションを GUI で作成する場合、次のような画面の設定があります。
ポイントとなるのが「スナップショットをすぐに作成し、サブスクリプションを初期化できるようにそのスナップショットを保持する」というオプションです。
このオプションを有効にすることで初期同期のスナップショットが取得されますが、このオプションはそれ以外の動作についても影響を与えています。
その設定が、パブリケーションの「immediate_sync」の設定です。
この設定については、sp_addpublication (TRANSACT-SQL) で解説が行われています。
説明には次の記載があります。
パブリケーションの同期ファイルが、スナップショット エージェントが実行されるたびに作成されるかどうかを指定します。 immediate_synchronizationはnvarchar (5) 、既定値は FALSE。 場合true、同期ファイルが作成またはスナップショット エージェントを実行するたびに再作成します。 登録者は、サブスクリプションが作成される前に、スナップショット エージェントが完了した場合は、同期ファイルをすぐに得られます。 新しいサブスクリプションは、最近実行されたスナップショット エージェントによって生成された最新の同期ファイルを取得します。 independent_agent必要がありますtrueのimmediate_synchronizationするtrueします。 場合false、新しいサブスクリプションがある場合にのみ、同期ファイルが作成されます。 呼び出す必要がありますsp_addsubscription既存のパブリケーションを段階的に新しいアーティクルを追加するときに、サブスクリプションごとにします。 サブスクリプションの後、スナップショット エージェントが起動して完了するまでは、サブスクライバーでは同期ファイルを取得できません。
冒頭の GUI のオプションを有効にした場合「@immediate_sync=true」としてパブリケーションの作成が行われます。
既存環境で設定を確認したい場合は、次のクエリで確認をすることができます。
select name,immediate_sync from syspublications
デフォルトの False と True の場合では、レプリケーションの初期化 (初期スナップショットの作成) のタイミング以外に「パブリケーションにアーティクルを追加した際の初期化対象」が異なります。
レプリケーションによる同期対象を増やす際に「既存のパブリケーションに対してアーティクルを追加」することで、同期対象テーブルを増やすことがあるのではないでしょうか。
「immediate_sync = false (デフォルト : テーブルを検索した場合の値は 0)」 の場合、「スナップショットレプリケーション」を実行した際には、スナップショットが取得されていないアーティクルに対してのみスナップショットレプリケーションの対象となります。
対象となるアーティクルについては、次のようなクエリで確認ができるかと。
DECLARE @publication varchar(255) ='tpch_replication' select art.name,* from dbo.sysextendedarticlesview art inner join dbo.syspublications pub on art.pubid = pub.pubid where pub.name = @publication and exists (select sub.artid from dbo.syssubscriptions sub where sub.artid = art.artid and sub.sync_type = 1 and sub.status in (0,1,3) )
初期状態であれば「スナップショットレプリケーションの実行」を行った場合は、追加したアーティクルのみがスナップショットレプリケーションでデータが生成される対象となるため、移行対象を増やした際の処理時間を短縮させることができます。
パブリケーションに含まれるアーティクル全てのスナップショットを取得したい場合は「サブスクリプションの再初期化」を実行することで全アーティクルが初期化対象としてマークされ、関連するアーティクルで静止点を作成してデータを移行することになります。
「immediate_sync=true」となっている場合は、「スナップショットレプリケーションを実行すると、パブリケーションに含まれているアーティクル全てをスナップショットの対象とする」という動作となります。
つまり、アーティクルを 1 つ追加し、初期データの連携用にスナップショットレプリケーションを作成した際には、「サブスクリプションの再初期化」相当の初期データの連携が毎回行われることになります。
GUI の設定の名称だけですと、初期スナップショットの生成タイミングの違いを表すチェックのように読めてしまいますが、実際の運用の中でアーティクルの追加をした場合の初期同期方法が変わってくるのは注意をしておいた方が良いのではないでしょうか。