SQLServerトランザクションレプリケーション は、複数の宛先にデータをコピーまたは配布するために使用される最も一般的に使用されるレプリケーション手法の1つです。前回の記事では、SQL Serverレプリケーション、レプリケーションの種類、およびトランザクションレプリケーションの動作に関する基本的な内部について説明しました。次に、SQLServerトランザクションレプリケーションがどのように機能するかについての高度な内部について詳しく説明します。
トランザクションレプリケーションアーキテクチャ
始める前に、ここにある私の以前の記事で知識を更新することをお勧めします。
まず、Microsoftのドキュメントから以下に示すSQLServerトランザクションレプリケーションアーキテクチャを調べてみましょう。

パブリッシャーデータベース 、パブリケーションを作成します 記事のリストを構成する (テーブル 、ビュー 、など)サブスクライバーに複製する必要があります データベース。記事のレプリケーションが有効になると、これらの記事で発生した変更はすべてレプリケーションのマークが付けられます パブリッシャーデータベースのトランザクションログにあります。
SQL Serverトランザクションレプリケーションは、パブリッシャーから初期化できます。 ディストリビューターへ 次に、サブスクライバー スナップショットエージェントを介したデータベース またはフル バックアップ 。スナップショットエージェントは、初期化を実行できます レプリケーション構成ウィザード経由 。フルバックアップは、T-SQLステートメントを介してのみサポートされます。
ログリーダーエージェント パブリッシャーデータベースのトランザクションログをスキャンして、レプリケーション用にマークされた追跡された変更を検出します。トランザクションログにキャプチャされた他の変更を無視し、データの変更をトランザクションログからディストリビューションデータベースにコピーします。
ディストリビューションデータベースは、パブリッシャーまたはサブスクライバーのいずれかにあるか、別の独立したSQLServerインスタンスにある可能性があります。次の点に注意してください。
- Log Reader Agentは、ディストリビューターサーバーから継続的に実行され、レプリケーション用にマークされた新しいコマンドをスキャンします。ただし、継続的に実行するのではなく、スケジュールに従って実行する場合は、作成されるログリーダーエージェントのSQLジョブを変更できます。
- Log Reader Agentは、レプリケーションのマークが付けられたすべてのレコードをトランザクションログからバッチで取得し、ディストリビューションデータベースに送信します。
- ログリーダーエージェントは、パブリッシャーデータベースのトランザクションログからコミットされたトランザクションのみを取得します。そのため、Publisherデータベースで長時間実行されるクエリは、アクティブなトランザクションの完了を待機しているため、レプリケーションに直接影響を与える可能性があります。
ディストリビューションエージェントは、ディストリビューションデータベースからすべての未配信の新しいコマンドを取得し、プッシュのいずれかを介してサブスクリプションデータベースに適用します。 またはプル メカニズム 。
- プッシュサブスクリプション –ディストリビューター 所有権を取得して、ディストリビューションデータベースからサブスクライバーに変更を適用します。
- プルサブスクリプション– サブスクライバー データベースが所有権を取得して、ディストリビューションデータベースからサブスクライバーに変更をフェッチします。
レコードがDistributionからSubscriberデータベースに正常に配布されると、 Distributedとしてマークされます。 また、ディストリビューションデータベースからの削除のマークも付けられています 。
重要なレプリケーションメンテナンスジョブの1つは、ディストリビューションクリーンアップです。 :分散ジョブは10分ごとに実行され、分散データベースから分散レコードを削除して、制御下にある分散データベースのサイズを維持します。
したがって、現在の記事の目標は、次のトピックを調査することです。
- ディストリビューションデータベース
- レプリケーションエージェント
- スナップショットエージェント
- ログリーダーエージェント
- 配布エージェント
- レプリケーションエージェントプロファイル
- レプリケーションメンテナンスジョブ
- レプリケーションレイテンシとトレーサートークン
- TableDiffユーティリティ
- SQLServerエージェントアラート
SQLServer配布データベース
ディストリビューションデータベース は、レプリケーションの構成中に作成されるシステムデータベースです。ほとんどのプロセスがディストリビューションデータベースを使い果たしているため、これはレプリケーションの中心です。
ディストリビューションデータベースの性質上、バックアップや復元など、限られた操作しか実行できません。ユーザーデータベースのように直接ドロップすることはできません。

大量のデータが複製されている巨大なデータベースの場合、複製スループットのパフォーマンスを向上させるために、いくつかの特別な対策を講じる必要があります。
デフォルトでは、ディストリビューションデータベースはSQLServerで構成されたデフォルトのインストールパスに作成されます。 。構成されていない場合は、 Cで作成されます : ドライブまたはSQLServerインストールフォルダー内。パフォーマンスを向上させるために、ディストリビューションデータベースをより高速なストレージ/ディスクに移動することをお勧めします。
初期ファイルサイズ および自動成長 ディストリビューションデータベースのサイズは、モデルデータベースの初期ファイルサイズと自動拡張設定に従って設定されます。トランザクションでビジーなデータベースレプリケーションの場合は、初期ファイルサイズを10GBなどのより適切な値に構成します。自動拡張プロパティは、データファイルとログファイルの両方で最大512MBまたは1GBである必要があります。そうすれば、データファイルとログファイルの断片化はあまり起こりません。

毎日を構成します または定期的なバックアップジョブ 参照目的またはデータの破損や損失が発生した場合のトラブルシューティングのために、ディストリビューションデータベースを含める。
毎日のインデックスの再編成を構成します またはメンテナンス ジョブ ディストリビューションデータベースを含める。データベースには、 MSrepl_transactionsへの膨大なデータ挿入が含まれます およびMSrepl_commands テーブル。
注:サブスクライバーデータベースにデータを正常に送信した後、これら2つのテーブルを継続的にポーリングし、それらからDELETEすると、断片化のリスクが高まります。これらのテーブルを定期的に再構築すると、ディストリビューションデータベースのパフォーマンスを向上させることができます。
レプリケーションに関連するディストリビューションデータベースの属性を表示および変更するには、レプリケーションを右クリックします。 >ディストリビューターのプロパティ :


省略記号をクリックします リストされている個々のオプションの詳細を表示するには、右側のボタンをクリックします。
パラメータを変更すると、ディストリビューションデータベースのパフォーマンスに影響を与える可能性があることに注意してください。したがって、変更するすべてのパラメータを慎重に評価した後でのみ、変更を実装してください。

トランザクションの保持 ディストリビューションデータベースに保持するデータの量を指定します。最小値と最大値は、時間または日で指定できます。
トランザクション保持値を0時間に設定すると、レコードがサブスクライバーデータベースに正常に複製されたら、ディストリビューションデータベースから削除できることを示します。この値を増やすと、ディストリビューションデータベースのサイズが大きくなります。したがって、それに応じて計画する必要があります。
履歴の保持 トランザクションレプリケーションパフォーマンス履歴データを保存するための保持期間を指定します。デフォルトでは48時間です。
ディストリビューションデータベースを削除する 、パブリケーションを無効にする必要があります その特定のディストリビューションデータベースに関連付けられ、2つの方法のいずれかを使用してドロップします。 1つは、公開の無効化と配布ウィザードの組み合わせです。もう1つは、 sp_dropdistributorを使用しています。 またはsp_dropdistributiondb 手順。ウィザードは、これら2つの手順を内部的に使用して、ディストリビューションを無効にし、ディストリビューションデータベースを削除します。
SQLServerレプリケーションエージェント
レプリケーションエージェント は、パブリッシャーからのデータ変更を追跡し、それらの変更をディストリビューターおよびサブスクライバーデータベースに伝播するスタンドアロンプログラムです。これらはSQLServerエージェントジョブとして実行されます。
まず、これらのスタンドアロンプログラムの場所を見てみましょう。
レプリケーションを構成するには、レプリケーションコンポーネントが必要です。 SQLServerインストーラーを介してインストールされます。完了すると、インストールパスで使用可能なレプリケーションエージェント関連のスタンドアロンプログラムを確認できます。
C:\ Program Files \ Microsoft SQL Server \ 130 \ COM

私の場合、SQL Serverのバージョンは2016です。したがって、パスでは130未満です。
すべてのReplicationAgentについて、利用可能なそれぞれのスタンドアロンプログラムを確認できます。
- DISTRIB.exe –配布エージェント
- Logread.exe –ログリーダーエージェント
- Qrdrsvc.exe –キューリーダーサービスエージェント
- Replmerg.exe –マージレプリケーションエージェント
- Snapshot.exe –スナップショットエージェント
- Tablediff.exe –テーブルを比較するためのユーティリティ。詳細については、この記事の後半で説明します。
これらのスタンドアロンプログラムが何を担当し、どこに配置されているかがわかったので、SQLServerエージェントジョブを介してそれらがどのように実行されるかを理解できます。
SQL Serverトランザクションレプリケーションを扱っているので、スナップショットエージェント、ログリーダーエージェント、および配布エージェントのジョブを実行します(同じロジックが他のすべてのエージェントに適用されます)。
スナップショットエージェント
スナップショットエージェントは、ディストリビューションデータベースを保持しているサーバーから実行されます。パブリッシャーのパブリケーションに含まれるすべての記事のスキーマと初期データを準備し、スナップショットフォルダーにスナップショットファイルを作成し、同期の詳細をディストリビューションデータベースに記録します。
ディストリビューションからMSSnapshot_agents 表から、スナップショットエージェントアクティビティを実行するSQLServerエージェントジョブを特定できます。すべてのパブリケーションには、スナップショットエージェントの責任を処理する必要がある専用のSQLServerエージェントジョブが含まれます。

SQLServerエージェントを展開します 上記のジョブ名を開きます。詳細とカテゴリが表示されます 名前– REPL-スナップショット

ステップをクリックします スナップショットエージェントによって実行されたアクティビティを確認します。

スナップショットエージェントジョブの情報を表示するには、個々のステップをクリックします。
ステップ1 sp_MSadd_snapshot_history を使用して、Snapshotエージェントが起動するたびに履歴テーブルへのエントリをログに記録します 手順。

スナップショットエージェントによって実行された詳細の履歴を保持するテーブルは、 MSsnapshot_historyです。 ディストリビューションデータベースのテーブル。

スナップショットエージェントのステータスの表示と一致します ダイアログウィンドウ。

ステップ2に移動します –エージェントの実行 。 スナップショットエージェントジョブを開始します 。

コマンドの下 、T-SQLステートメントまたはクエリが見つかりませんでした。記載されているパラメータは一部のみでした。したがって、答えは上の図の強調表示されたセクションにあります。これは、ジョブステップタイプを示しています レプリケーションスナップショットです snapshot.exeスタンドアロンプログラムを起動します スナップショットエージェントの責任を実行します。
snappaper.exeの詳細については、このMSDNの記事を参照してください。レプリケーション関連の問題のトラブルシューティングについても、後で詳しく説明します。
最後に、ステップ3 に進みます –最後のジョブステップ。エージェントジョブの予期しないシャットダウンをキャプチャし、ログアウトします。

ログリーダーエージェント
パブリケーションがデータベースで構成されている場合は常に、それらのアーティクルに発生した変更は、トランザクションログでレプリケーションのマークが付けられます。 Log Reader Agentは、logread.exeを介してこれらのデータ変更を読み取り、2つの別々のプロセスを介してディストリビューションデータベースに保存します。
- トランザクションログを読む – sp_replcmdsを使用します パブリッシャーからのデータ変更をスキャンするための拡張ストアドプロシージャ。このストアドプロシージャはDLLファイルを参照するため、Microsoftがログファイルを正確に読み取る方法に関する内部情報は特定されていません。ただし、 fn_dblog()のような文書化されていない関数を試すことはできます およびfn_dump_dblog() トランザクションログファイルがどのように機能するかを理解するため。
- ディストリビューションデータベースへの書き込み – sp_MSadd_replcmdsを使用します パブリッシャーデータベースのトランザクションログから読み取られたバイナリデータを書き込むためのディストリビューションデータベースのストアドプロシージャ。トランザクションの詳細をMSrepl_transactionsに書き込みます MSrepl_commandsへのテーブルと個々のコマンド テーブル。
公開されたデータベースごとに使用できるログリーダーSQLServerエージェントジョブは1つだけです。その名前は次のように識別できます:

SQL Serverエージェントを展開し、上記のログリーダーエージェントジョブを開いて手順を表示します。ジョブが表示されますСategory レプリケーションログリーダーの下。

ステップをクリックします ログリーダーエージェントによって実行される個々の手順を確認します。スナップショットエージェントジョブと同様に、ログリーダーエージェントジョブの3つの同等の手順を確認できます。

ステップ1 sp_MSadd_logreader_historyを呼び出します ログリーダーエージェントの起動ステータス履歴メッセージをMSlogreader_historyに記録する手順 テーブル。

ステップ2 logread.exeスタンドアロンプログラムを使用してログリーダーエージェントプロセスを開始します 。

logread.exeの詳細については、それぞれのMSDNの記事を参照してください。後で、ログリーダーエージェントの重要な構成パラメーターについても調べます。
ステップ3 ログリーダーエージェントジョブの突然のシャットダウンをキャプチャします。

配布エージェント
ディストリビューションエージェント(DISTRIB.exe)は、トランザクションおよびスナップショットレプリケーションによって使用され、初期スナップショットファイルを適用し、ディストリビューションデータベースからサブスクライバーデータベースに使用可能な保留中のトランザクションを増分または適用しました。
このエージェントは、プッシュサブスクリプションの場合はディストリビューターサーバーから、プルサブスクリプションの場合はサブスクライバーサーバーから実行されます。配布エージェントの責任を実行するSQLServerエージェントジョブの名前を見つけるために、以下に示すように特定のクエリを実行できます。

SQL Serverエージェントジョブを展開して開き、レプリケーションディストリビューションに割り当てられている詳細情報とカテゴリを確認します。

ステップをクリックします –スナップショットおよびログリーダーエージェントジョブの以前に公開された手順と同様の手順が表示されます。

ステップ1 sp_MSadd_distribution_historyを呼び出します ログリーダーエージェントの起動ステータス履歴メッセージをMSdistribution_historyに記録する手順 テーブル。

ステップ2 ディストリビューションエージェントプロセス(DISTRIB.exe)をデフォルトのパラメータで開始します。

DISTRIB.exeの詳細については、MSDNの記事を参照してください。さらに、次の記事でディストリビューションエージェントの重要な構成パラメータについて説明します。
ステップ3 ディストリビューションエージェントジョブの突然のシャットダウンに関する詳細をキャプチャします。

レプリケーションエージェントプロファイル
ディストリビュータープロパティから 、レプリケーションエージェントプロファイルを表示するオプションを取得できます 。エージェントプロファイルはデフォルト値のままにし、トラブルシューティングの目的で必要な場合にのみ変更します。

プロファイルのデフォルトをクリックします サーバーで使用可能なすべてのレプリケーションエージェントに設定されているデフォルト値を表示します。

配布エージェントを選択します セクションをクリックし、省略記号をクリックします デフォルトのエージェントプロファイルの横にあるボタン 構成された値を確認します。下の図を参照してください:

デフォルトのエージェントプロファイルを表示する スナップショットエージェント リーダーエージェント:

デフォルトのエージェントプロファイル ログリーダーの場合 エージェント:

レプリケーションメンテナンスジョブ
レプリケーションエージェントの他に、レプリケーションメンテナンスジョブがあります。 。
これらは、SQLServerトランザクションレプリケーションの構成中に作成されたSQLServerエージェントジョブです。これらは、トランザクションレプリケーションが正しく機能していることを確認するために使用できます。
レプリケーションのメンテナンスに関する一部のジョブは、トランザクションレプリケーションに不可欠です。それらを確認しましょう。
- 配布のクリーンアップ: 配布 – sp_MSdistribution_cleanupを実行します MSrepl_transactionsからレプリケーションコマンドを削除する手順 およびMSrepl_commands テーブル。クリーンアップは、ディストリビューションデータベースで構成されたトランザクション保持期間の値に基づいてコマンドがサブスクライバーデータベースに正常に送信された後、ディストリビューションデータベースで行われます。デフォルトでは、このジョブはディストリビューションデータベースで10分ごとに実行されます。これらの値は、詳細な評価の後でのみ変更してください。

- エージェント 履歴のクリーンアップ:配布 – sp_MShistory_cleanupを実行します そのデータベースで構成された履歴保持期間より古い履歴レコードをクリーンアップするためのディストリビューションデータベースの手順。デフォルトでは、48日間構成され、10分ごとに実行されます。これらの値を変更する場合は、すべての側面を慎重に検討してください。

- 期限切れ サブスクリプションのクリーンアップ – sp_expired_subscription_cleanupを実行します 期限切れまたは長期間非アクティブだったサブスクリプションを削除するためのマスターデータベースの手順。デフォルトでは、この手順は1日1回実行されます。

レプリケーションレイテンシとトレーサートークン
レプリケーションレイテンシ は、ディストリビューターを介してサブスクライバーに正常に配信されるまで、パブリッシャーデータベースから公開された記事で発生した変更を追跡するためにレプリケーションプロセスに必要な時間です。
レプリケーションレイテンシはミリ秒単位で測定されます。 0(リアルタイムレプリケーション)から非常に低い値(理想的な場合)までのターゲット値。これは、レプリケーションのパフォーマンスを監視するための重要な手段の1つです。
レプリケーションモニターまたは専用のsp_replcounters を使用して、レプリケーションレイテンシを確認できます。 手順。

レプリケーションモニター以降 更新があります レート、観察された値からわずかな偏差があるかもしれません。レプリケーションの待ち時間を計算する際のわずかな偏差を克服するために、トレーサートークンが役に立ちます。
トレーサートークンをクリックします タブ(上の画像を参照)を使用して、パブリッシャーから新しいテストコマンドのセットを送信します。次に、ディストリビューターデータベースに到達したとき、およびサブスクライバーデータベースに送信されたときに測定します。 トレーサーの挿入をクリックします パブリッシャーデータベースからトレーサートークンを送信するには:

サブスクライバーでレコードが正常に受信されると、現在のセットアップのレプリケーションレイテンシの合計を追跡できます。この場合、9秒です。パブリッシャーからディストリビューターまで4秒、ディストリビューターからサブスクライバーまで5秒です。

Tablediffユーティリティ
Tablediffユーティリティ(tablediff.exe) パスC:\ Program Files \ Microsoft SQL Server \ 130 \ COMにインストールされます レプリケーションコンポーネントをインストールしたら。
TableDiffユーティリティは、2つのテーブルを非収束について比較します。これは、2つのテーブルを比較して、それらの違いを特定できることを意味します。次に、専用のINSERT / UPDATE / DELETEスクリプトを生成することにより、宛先テーブルをソーステーブルと比較して同期します。詳細については、公式ドキュメントをご覧ください。
SQL Server Transactional Replicationは、サブスクライバデータベースの手動変更を考慮しないため、このユーティリティは、必要に応じて、これらの種類のテーブルを同期するのに役立ちます。ただし、ウィザードやUIはありません。アクセスできるのは、コマンドプロンプトまたはバッチファイルからのみです。
他のツールを使用すると、比較と同期が簡単になります。 SQLServer用のdbForgeCompareBundleは、データベース内の不一致をチェックし、特定のテーブルがそれらを識別して分析します。また、それらを同期するために必要なスクリプトを生成します。視覚的なインターフェースと、タスクをすばやく簡単に実行するための一連のオプションを提供します。
SQLServerエージェントアラート
ジョブはSQLServerエージェントジョブの下にあるため、レプリケーションエージェントに関連するすべての主要コンポーネントが存在します。したがって、SQL Serverエージェントのジョブがどのように機能するかを継続的に監視して、レプリケーションが問題なく機能することを確認することが重要です。最も一般的な問題は次のとおりです。
- レプリケーションエージェントジョブの実行に関する権限の問題
- レプリケーションメンテナンスジョブの実行に関する権限の問題。
- パブリッシャー、ディストリビューション、またはサブスクライバーデータベースへのアクセスに関する権限の問題。
- SQLServerエージェントがサーバーの再起動時に自動的に起動するように構成されていません。
- 競合、データの欠落など、その他のレプリケーション関連のデータの問題。
そのため、問題についてDBAまたは他の人にすぐに通知するための適切なアラートメカニズムを導入する必要があります。
ジョブの失敗やエラーが発生した場合にDBAまたは他の人に警告するには、電子メールアラートを送信するようにデータベースメールを構成する必要があります。これにより、DBAはすぐに応答して問題を修正できます。データベースメールとアラートの構成方法については、後の別の記事で説明します。
レプリケーションの構成中に、SQLServerはデフォルトで以下のアラートのセットを作成します。必要な基準に合わせて簡単に構成できます。また、必要な人に通知を送信して、すぐに対応できるようにします。

結論
レプリケーションに関する別の巨大な記事を読んでいただきありがとうございます。トランザクションレプリケーションの内部と、それらを担当するディストリビューションデータベース、レプリケーションエージェント、およびスタンドアロンプログラムの詳細を明確にするのに役立つことを願っています。また、レプリケーションレイテンシ、アラート、トレーサートークンも特定しました。
これで、レプリケーションの問題を専門的に処理および解決する方法をさらに深く掘り下げることができます。次の記事をお楽しみに!