web-dev-qa-db-ja.com

SQL Serverレプリケーション:パブリケーションの初期スナップショットはまだ利用できませんか?

私はトランザクションレプリケーションをセットアップし、ディストリビューター、パブリッシャーは同じWindowsサーバー上にあり、サブスクライバーは同じサーバー上にあり、プッシュスナップショットを使用する他のWindowsサーバー上にある2つのサブスクライバーです。

同期ステータスのメッセージが表示されます。そのスナップショットはまだ利用できません。数時間前に、トランザクションが同期されるたびに正常に機能していました。私が間にした唯一のことは、そのプロパティを使用して、より多くの記事(ストアドプロシージャなど)をパブリケーションに追加することでした。

ここで問題が発生しているか、エラーメッセージは表示されません。データを複製することができません

1
tsu90280

スナップショット(@sync_type = 'automatic')から同期されるトランザクションレプリケーションにアーティクルを追加したら、スナップショットエージェントを実行して、追加したアーティクルのスナップショットを生成する必要があります。 immediate_syncパラメーターに応じて、パブリケーション全体のスナップショット(1)または追加した記事(0)のみのスナップショットが作成されることに注意してください。

1
jesijesi

ストアドプロシージャを追加した後、それらに問題がある可能性があります。多分それらは腐敗しています。私の場合、それらは、レプリケートされたデータベースにはない記事を参照したため、破損していました。したがって、ストアドプロシージャをチェックするか、1つずつ追加することをお勧めします(ただし、最善の方法ではありません)。私があなたのような状況に対処したときはいつでも、私は常に想定してきました。公開されたデータベースに何か問題があり、いつもそうでした。問題を解決して再初期化すると、問題が解決し、通常のプロセスが機能し始めます。

1
M_S_N

トランザクションレプリケーションパブリケーションに新しいアーティクルを追加するときは、別のスナップショットを実行して、それらの新しいアーティクルを現在のすべてのサブスクライバーに追加する必要があります。

これは例です 同様の質問から 現在アクティブなパブリケーションに別の記事を追加する方法が示されています。

---------------------------------------------------------------------------------------------------
-- add the table back to the replication
---------------------------------------------------------------------------------------------------

SET TRANSACTION ISOLATION LEVEL read committed;

EXEC sp_addarticle @publication = N'Product_Staging', 
                   @article = N'CategoryImportMap',
                   @source_object=N'CategoryImportMap',
                   @destination_table =N'CategoryImportMap'
GO

--========================================================================
-- REFRESH THE SUBSCRIPTIONS
--========================================================================
EXEC sp_refreshsubscriptions @publication = N'Product_Staging'
GO

--========================================================================
-- Start the Snapshot Agent job.
--========================================================================
EXEC sp_startpublication_snapshot @publication = N'Product_Staging'
go


-- check the number of rows (source and destination) for the new articles

追加する価値のあるもう1つのことは、パブリケーションの設定に応じて、すべての記事のスナップショット(非常に多くのリソースを消費する可能性があります)または新しい記事を追加するためにのみスナップショットを実行する必要があることです。欲しいです。

これは非常によく説明されています Cozzaro Neroによるこの回答

immediate_syncおよびallow_anonymousがFALSE(0)に設定されていることを確認してください変更された記事のスナップショットだけでなく、完全なスナップショットの作成は避けてください。

SELECT immediate_sync, allow_anonymous 
FROM Your_Published_DBName.dbo.syspublications

これらの値が[〜#〜] false [〜#〜]に設定されていない場合は、次のように変更できます。

EXEC sp_changepublication
@publication = 'Product_Staging',
@property = N'allow_anonymous',
@value = 'false'

immediate_syncが無効になっている場合、トランザクションはサブスクライバーに複製されるとすぐに削除されます。新しいサブスクライバーを追加したり、既存のサブスクライバーを再初期化したりする特定のビジネスニーズがない限り、無効にしても安全です。

EXEC sp_changepublication
@publication = 'Product_Staging',
@property = N'immediate_sync',
@value = 'false'

私は これらのスクリプト を使用して、トランザクションレプリケーション設定の一部を確認および監視しています。

このタイプのメッセージを受け取ったとき:

パブリケーション「FMS_PUB」の初期スナップショットはまだ使用できません。

私は次のことを行います:

  1. サブスクライバーのスクリプトを作成します-ドロップと作成(後で必要になるため)
  2. 問題の加入者をドロップします
  3. 上記のスクリプトからサブスクライバーを再作成します
  4. レプリケーションモニターを開く
  5. 新しいスナップショットを使用してサブスクリプションに再初期化のマークを付ける
  6. このパブリケーションのスナップショットエージェントを実行する
  7. サブスクリプションのログリーダーを再起動します(たぶんこれは悪い習慣です)

これで通常この問題は解決します。

これはすべて レプリケーションモニター の代わりに script でも実行できます。

1