SQL Server 2016では、2つのデータベースの一部のテーブルでMergeレプリケーションが正常に実行されています。次に、同じデータベースのペア間で別のテーブルセットのスナップショットレプリケーションを復元する必要がありました。古いサーバーからT-SQLスクリプトを実行して、スナップショットのパブリケーション/サブスクリプションを復元しました。すべてがうまくいき、出版物とサブスクリプションが作成されました。初めてスナップショットエージェントを手動で実行してから、[同期ステータスの表示]ダイアログで手動で同期をトリガーしました。
パブリケーション内のすべての記事には、宛先テーブルのドロップと再作成の設定がありました。最初の同期が完了した後、ソーステーブルと宛先テーブルを比較し、行数が等しいことを確認しました。必要なものだけです。
ただし、最初のスナップショットを配信した後、たとえばMergeレプリケーションの場合のようにレプリケーションプロセスが完了しなかったことに驚いています。代わりに、[同期ステータスの表示]ダイアログは、同期が実行中であると報告しますが、No replicated transactions are available
メッセージが表示されます。以下を参照してください:
次に、このサブスクリプションの同期履歴を確認したところ、実際の同期が実際の行/テーブルをコピーせずに既に20時間以上実行されていることがわかりました。いつも新しい変更/スナップショットを待っているようです。以下を参照してください:
上の画像は、REPL-Snapshot
エージェントジョブが毎日午前3時に実行されるようにスケジュールされているため、午前3時頃に変更の一括コピーを正しく報告しています。ただし、SQL Serverエージェントジョブモニターから、スナップショットパブリケーションのREPL-Distribution
、REPL-LogReader
、およびREPL-QueueReader
ジョブが常に実行されていることがわかります。
質問は次のとおりです:上記の動作は正常な動作ですか?スナップショットレプリケーションジョブは、新しいスナップショットを処理して終了しないでください。または、キューおよびログリーダージョブのスケジュールも不足していますか?レプリケーションが完了しない場合、トランザクションログを解放できないのではないかと心配しています。
このパブリケーション/サブスクリプションのT-SQLスクリプトには、次の行が含まれています。
exec [DB1].sys.sp_addlogreader_agent @job_login = null, @job_password = null, @publisher_security_mode = 1
GO
exec [DB1].sys.sp_addqreader_agent @job_login = null, @job_password = null, @frompublisher = 1
GO
同期が常に実行されているかどうかは不明です。ここで何が起こっているかについての洞察は非常に高く評価されます。
これはディストリビュータエージェントの正しい状態です。 (スナップショットエージェントによってスケジュールされた時間に作成された)スナップショットから配信した後、「(...)からのスナップショットの配信」として終了したアクションがトリガーされました。配信は常にオンのディストリビュータによって実行され、新しいアクション(スナップショット)を探します。したがって、実際には、スナップショットレプリケーションには2つのジョブがあります。スケジュールによってトリガーされるスナップショットエージェントと、新しいアクションを待機している(アクティブな)ディストリビューターエージェントです。 「複製されたトランザクションは利用できません」とは、ここでは、配布する新しいスナップショットがないことを意味します。
仕様により、ディストリビューターエージェントは常に実行され、スナップショットエージェントでスケジュールされた新しいスナップショットをリッスンする必要があります。