SQL Serverトランザクションレプリケーションは、データを複数の宛先に共有、コピー、または配布するために使用される最も一般的なレプリケーション手法の1つです。この記事では、レプリケーション、さまざまなレプリケーションタイプについて説明し、トランザクションレプリケーションの作業に特に注意を払います。
SQLトランザクションレプリケーションとは何ですか?
レプリケーションは、データの一貫性を維持しながら、あるデータベースから別のデータベースにデータをコピーまたは配布するためのSQLServerテクノロジです。
レプリケーションを使用して、あるデータベースから別のデータベースにデータを転送できます
- 同じサーバー上の同じインスタンスまたは別のインスタンス上;
- または単一の場所または複数の場所にあるサーバー間。
まず、レプリケーションアーキテクチャを確認し、レプリケーションの用語を理解する必要があります。
SQLServerレプリケーションのアーキテクチャと用語
- 発行者 別のデータベースに配布できるデータ変更を公開するソースデータベースインスタンスです。 単一のサイト運営者からのデータ 単一のサブスクライバーに送信できます または複数のサブスクライバー 。
- サブスクライバー は、パブリッシャーデータベースからキャプチャされたデータ変更を配布する宛先データベースインスタンスです。サブスクライバーは、パブリッシャーインスタンスまたはパブリッシャーサーバー内の別のインスタンス/同じ場所/離れた場所にある別のサーバーのいずれかになります。データの変更がサブスクライバーデータベースインスタンスに配布される前に、これらのデータはディストリビューターに保存されます。 。
- ディストリビューター は、パブリッシャーデータベースからキャプチャされた変更ログを格納するデータベースです。サーバーがディストリビューターとして有効になっている場合、サーバーはディストリビューションデータベースという名前のシステムデータベースを作成します。 。
配布データベースの場所によって、ローカルまたはリモートのディストリビューターとして分類できます。
–ローカルディストリビューター Publisherデータベースインスタンスにあるディストリビューションデータベースです。
–リモートディストリビューター は、サブスクライバデータベースインスタンスまたはパブリッシャデータベースインスタンス以外のSQLServerインスタンスのいずれかに存在するディストリビューションデータベースです。
決定的な要因は、ディストリビューションデータベースをパブリッシャーインスタンス(別のインスタンス)のどこに配置するかです。データ配布の負荷を処理するために使用できるサーバーリソースによって異なります。
データがディストリビューションデータベースからサブスクライバーインスタンスに送信される方法に応じて、データはプッシュのいずれかに分類できます。 またはプルサブスクリプション 。
–サブスクリプションのプッシュ これは、ディストリビューションデータベースがデータをサブスクライバデータベースインスタンスにプッシュする責任を負うことを意味します。
–プルサブスクリプション これは、サブスクライバーデータベースインスタンスが、ディストリビューションデータベースから利用可能なデータをプルし、それをサブスクライバーデータベースに適用する責任を負うことを意味します。
- 記事 レプリケーションの基本単位です。これは、パブリッシャーからサブスクライバーに複製されるこのデータベースオブジェクトまたは記事のデータ変更を示します。記事は、テーブル、ビュー、インデックス付きビュー、ストアドプロシージャ、またはユーザー定義関数にすることができます。
- 出版物 Publisherのデータベースからの1つ以上の記事のコレクションです。
- サブスクリプション 受信するパブリケーションを定義します。また、どのパブリケーションから、どのスケジュールでデータが複製されるかを決定します。サブスクリプションは、プッシュまたはプル(パブリケーションからサブスクリプションへ)のいずれかになります。
- レプリケーションエージェント は、変更を追跡し、パブリッシャーからディストリビューターおよびサブスクライバーにデータを配布するスタンドアロンプログラムです。すべてのレプリケーションエージェントは、SQLServerエージェントの下でジョブとして実行されます。したがって、SQLServerエージェントジョブまたはレプリケーションモニターでSSMSを介して管理できます。次のタイプのレプリケーションエージェントを使用できます。
- スナップショットエージェント –ほぼすべてのタイプのレプリケーションで使用されます。スナップショットエージェントは、ディストリビューションデータベースを保持しているサーバーから実行されます。出版社の出版物に含まれるすべての記事のスキーマと初期データを準備します。また、スナップショットフォルダーにスナップショットファイルを作成し、ディストリビューションデータベースに同期の詳細を記録します。
- ログリーダーエージェント –トランザクションレプリケーションで使用されます。目標は、レプリケーションが有効になっている記事のデータ変更をパブリッシャーデータベーストランザクションログから読み取り、ディストリビューションデータベースに保存することです。ログリーダーエージェントはディストリビューターサーバーから実行されます。
- 配布エージェント –トランザクションおよびスナップショットレプリケーションで使用されます。初期スナップショットファイルと、ディストリビューションデータベースからサブスクライバデータベースへの増分または利用可能な保留中のトランザクションを適用します。ディストリビューションエージェントは、プッシュサブスクリプションの場合はディストリビューターサーバーから、プルサブスクリプションの場合はサブスクライバーサーバーから実行されます。
- マージエージェント –マージレプリケーションでのみ使用されます。これは、初期スナップショットファイルと、パブリッシャーまたはサブスクライバー全体の差分または増分変更の調整を適用します。マージエージェントは、プッシュレプリケーションの場合はディストリビューターサーバーで実行され、プルサブスクリプションの場合はサブスクライバーサーバーから実行されます。
- キューリーダーエージェント –キューリーダーエージェントは、キュー更新オプションを使用したトランザクションレプリケーションによって使用されます。変更をサブスクライバーからパブリッシャーに移動します。キューリーダーエージェントはディストリビューターサーバーから実行されます。
- レプリケーションメンテナンスジョブ –前に説明したように、すべてのレプリケーションエージェントは、レプリケーションの構成中にセットアップされるスタンドアロンプログラムです。これらは、SQLServerエージェントジョブの下でジョブとして実行されます。注意すべき重要な仕事は、配布のクリーンアップ:配布、エージェント履歴のクリーンアップ:配布、および期限切れのサブスクリプションのクリーンアップです。
レプリケーションの種類 SQLServerで
用語がわかったら、レプリケーションの種類について詳しく見ていきましょう。
- トランザクションレプリケーション 。名前が示すように、パブリッシャーのトランザクションスコープ内のすべてのトランザクションまたはデータの変更は、ネットワーク帯域幅とサーバーリソースに応じてわずかな遅延で、ほぼリアルタイムでサブスクライバーに送信されます。トランザクションレプリケーションは、ログリーダーエージェントを使用して、パブリッシャデータベースのトランザクションログからデータの変更を読み取ります。また、配布エージェントを使用して、サブスクライバーに変更を適用します。場合によっては、Snapshot Agentを使用して、複製されたすべての記事の初期スナップショットデータを取得することがあります。 Transactional Replication Publicationは、以下のカテゴリに分類される場合があります。
- 標準のトランザクションレプリケーション –サブスクライバーは、トランザクションレプリケーションの観点からは読み取り専用のデータベースです。サブスクライバーデータベースで誰かが行った変更は追跡されず、パブリッシャーデータベースに更新されません。標準のトランザクションレプリケーションは、トランザクションレプリケーションと呼ばれることがよくあります。
- 更新可能なサブスクリプションを使用したトランザクションレプリケーション は、サブスクライブで発生するデータ変更を追跡する標準トランザクションレプリケーションの拡張機能です。更新可能なサブスクリプションでデータの変更が開始されると、最初にパブリッシャーに伝達され、次に他のサブスクライバーに伝達されます。
- ピアツーピアレプリケーション 標準のトランザクションレプリケーションの拡張です。トランザクション的に一貫性のある変更をほぼリアルタイムで複数のサーバーインスタンスに伝播します。
- 双方向レプリケーション は、標準のトランザクションレプリケーションの拡張機能であり、2台のサーバー(2台のサーバーのみに制限されるため双方向という名前)が、パブリッシャー(別のサーバーに変更を送信するため)またはサブスクライバーとして機能するサーバーとデータ変更を相互に交換できるようにします。 (別のサーバーから変更を受け取るため)。
- レプリケーションのマージ –パブリッシャーとサブスクライバーの両方で発生するデータ変更のキャプチャをサポートし、それを他のサーバーに配布します。マージレプリケーションにはROWGUIDが必要です マージレプリケーションに関連するテーブル記事の列。トリガーを使用して、パブリッシャーとサブスクライバー全体のデータ変更をキャプチャします。また、パブリッシャーとサブスクライバーの両方がネットワークに接続されている場合、サーバー間で変更を配信します。マージレプリケーションは、マージエージェントを使用して、パブリッシャーとサブスクライバー間でデータの変更をレプリケートします。
- スナップショットレプリケーション –名前が示すように、Snapshot Replicationは、変更をキャプチャするためにトランザクションログまたはトリガーのいずれにも依存しません。パブリケーションに関連する記事のスナップショットを取得し、スナップショットの時点で利用可能なレコードを使用してサブスクライバーに適用します。スナップショットレプリケーションは、スナップショットエージェントを使用してパブリッシャーのスナップショットを取得し、ディストリビューションエージェントを使用してこれらのレコードをサブスクライバーに適用します。
SQLServerトランザクションレプリケーション
トランザクションレプリケーションは通常、OLTPパブリッシャーデータベースに大量のデータINSERT/UPDATEおよび/またはDELETEアクティビティがあるシナリオで推奨されます。
Publisherサーバーインスタンスでは巨大なDISKIOが発生しているため、レポートを生成すると重大なブロックが発生する可能性があります。また、サーバーのパフォーマンスに影響を与える可能性があります。したがって、ほぼリアルタイムのデータを備えた別のサーバーは、レポート要件をオフロードするのに適しています。
トランザクションレプリケーションの基本的な要件の1つは、レプリケートされるテーブルでプライマリキーを使用できるようにすることです。
トランザクションレプリケーションがどのように機能するかを要約できます。以下のMicrosoftの公式ドキュメントから抜粋したトランザクションレプリケーションアーキテクチャの図をご覧ください。
パブリケーションは、サブスクライバーデータベースに複製するための記事のリストを含むパブリッシャーデータベース上に作成されます。
トランザクションレプリケーションは通常、スナップショットエージェントまたはフルバックアップを介してパブリッシャーからディストリビューターに初期化されます。スナップショットエージェントは、レプリケーション構成ウィザードを介してサポートされます。フルバックアップは、トランザクションレプリケーションを初期化するためのTSQLステートメントを介してサポートされます。
Log Reader Agentは、パブリッシャーデータベースのトランザクションログをスキャンして、追跡された記事を探します。次に、データの変更をトランザクションログからディストリビューションデータベースにコピーします。
ディストリビューションデータベースは、パブリッシャーまたはサブスクライバーのいずれかになります。または、別の独立したSQLServerインスタンスにすることもできます。
次の点にも注意してください。
- Log Reader Agentは、ディストリビューターサーバーから継続的に実行され、レプリケーション用にマークされた新しいコマンドをスキャンします。ただし、継続的に実行するのではなく、スケジュールに従って実行する場合は、作成されるログリーダーエージェントのSQLジョブを変更できます。
- Log Reader Agentは、レプリケーション用にマークされたすべてのレコードをトランザクションログからバッチで取得し、それらをディストリビューションデータベースに送信します。
- ログリーダーエージェントは、パブリッシャーデータベースのトランザクションログからコミットされたトランザクションのみを取得します。そのため、Publisherデータベースで長時間実行されるクエリは、アクティブなトランザクションの完了を待機しているため、レプリケーションに直接影響を与える可能性があります。
ディストリビューションエージェントは、ディストリビューションデータベースからすべての未配布の新しいコマンドを取得し、プッシュまたはプルメカニズムを介してサブスクリプションデータベースに適用します。前述のように、プッシュサブスクリプションディストリビューターが所有権を取得してディストリビューションデータベースからサブスクライバーに変更を適用するのに対し、プルサブスクリプションサブスクライバーデータベースは所有権を取得してディストリビューションデータベースからサブスクライバーに変更をフェッチします。
レコードがDistributionからSubscriberデータベースに正常に配布されると、それらはDistributedとしてマークされ、Distributionデータベースからの削除のマークが付けられます。ディストリビューションクリーンアップという名前の主要なレプリケーションメンテナンスジョブの1つ:ディストリビューションジョブは10分ごとに1回実行され、ディストリビューションデータベースからディストリビューションレコードを削除して、ディストリビューションデータベースのサイズを管理します。
レプリケーションとトランザクションレプリケーションの概念の詳細な説明があれば、 AdventureWorksのレプリケーションを構成することでそれを手に入れることができます。 データベースと、理論的に説明されているすべてのコンポーネントのレプリケーションの検証。
トランザクションレプリケーションの段階的な構成(SSMS GUI経由)
トランザクションレプリケーションの構成には、次の3つの主要なステップが含まれます。
- ディストリビューションデータベースの構成
- パブリケーションの作成
- サブスクリプションの作成
レプリケーションを構成する前に、レプリケーションコンポーネントがSQL Serverインストールの一部としてインストールされていることを確認するか、SQLServerメディアを使用してレプリケーションコンポーネントをインストールしてください。タスクに必要です。
SSMSで、パブリッシャデータベースインスタンスに接続します レプリケーションを右クリックします :
現在、配布は構成されていません。したがって、[配布の構成]オプションがあります。ディストリビューションの構成ウィザードまたはパブリケーション作成ウィザードを使用して、ディストリビューションデータベースを構成できます。
ディストリビューションデータベースとパブリケーションを構成するには、次の手順に従います。
拡張 レプリケーション 新しい出版物を右クリックします 。
新しいパブリケーションウィザード 起動します。 次へをクリックします ディストリビューターを表示するには 構成オプション。
デフォルトでは、ディストリビューションデータベースを保持するパブリッシャーサーバーを選択します。リモートディストリビューションデータベースを使用する場合は、2番目のオプションを選択します。 次へをクリックします 。
次のオプションは、スナップショットフォルダを構成するためのものです。 。必要なフォルダに変更してください。それ以外の場合は、デフォルトでSQLServerインストールフォルダーのパスに作成されます。 次へをクリックします 。
パブリケーションデータベースを選択します (ここでは AdventureWorks )、[次へ]をクリックします 。
パブリケーションタイプを選択します –トランザクションレプリケーション 。 次へをクリックします 。
記事を選択します この出版物のために。テストの目的で、すべてのテーブルを選択します およびビュー :
次へをクリックする前に 、テーブルをもう一度展開して、いくつかの問題を確認します。
一部のテーブルは赤いアイコンでマークされています。これらのテーブルをクリックすると、トランザクションレプリケーションの重要な要件の1つである主キーがないため、テーブルをレプリケートできないことを示す警告が表示されます。後で詳しく説明します。次に、[次へ]をクリックします 。
記事の問題があるページ 依存関係に関連するものが表示されます。 次へをクリックします 。
次のオプションは、テーブル行のフィルタリングです。 –基本的なレプリケーションをテストしているため、無視できます。 次へをクリックします 。
スナップショットエージェントの構成 –無視して、次へをクリックします 。
エージェント 設定 –セキュリティ設定をクリックします スナップショットエージェントとその下のログリーダーエージェントを実行するようにアカウントを構成します。
次に、スナップショットエージェントプロセスを変更します SQLServerエージェントサービスアカウントで実行します。
ログリーダーエージェントを設定します パブリッシャーに接続>プロセスアカウントになりすます 。 OKをクリックします 。
エージェントセキュリティが更新されます。
したがって、ディストリビューターを構成しました。 および出版物のすべての要素 記事のように 、スナップショットエージェント 、ログリーダーエージェント 、およびエージェント証券 。ウィザードによるパブリケーションの作成はほぼ完了しました。
パブリケーションの作成に使用されるTSQLスクリプトについてさらに学習する必要がある場合は、スクリプトファイルを生成してパブリケーションを作成するを確認できます。 オプション。それ以外の場合は、[次へ]をクリックします 。
ファイルを保存することを選択したので、ウィザードでスクリプトファイルパスを設定できます。 および名前 。これらの詳細を入力して、[次へ]をクリックします 。
ウィザードは最終的にパブリケーション名を要求します 、私はそれを AdventureWorks_pubと名付けました データベース名とキーワードを使用して、識別しやすいように出版物として示します。
概要に記載されているすべてのデータを確認します ページをクリックし、完了をクリックします 。
ウィザードは、パブリケーションの作成に進行状況を表示します 。完了すると、確認が表示されます。 閉じるをクリックします 。
ディストリビューターが正常に作成されたことを確認するには (ディストリビューションデータベース)、システムデータベースを拡張します:
パブリケーションが正常に作成されたことを確認するには 、ローカルパブリケーションを展開します :
ディストリビューションデータベースを構成し、AdventureWorksデータベースにパブリケーションデータベースを作成しました 正常に。これで、サブスクリプションに進むことができます 作成
新しいパブリケーションを右クリックします 新しいサブスクリプションを作成して選択しました :
新規サブスクリプションウィザード 現れる。プロセスを開始するには、[次へ]をクリックします 。
出版物 ページは、両方の出版物を確認するように求めます およびパブリッシャー データベース が選択されています。 次へをクリックします 。
配布エージェントを設定します プッシュのいずれかに またはプル サブスクリプション。 パブリッシャーサーバーを使用します サブスクライバーとして、そのタイプは影響を与えません。したがって、デフォルトのプッシュのままにします。 サブスクリプション。 次へをクリックします 。
サブスクライバーを選択します (データベース)。 AdventureWorks_REPLを選択しています 同じAdventureWorksデータベースバックアップから復元されました。 次へをクリックします 。
エージェントセキュリティを設定します :
1台のサーバー内ですべてを実行するため、エージェントサービスアカウントを使用しています。 。
次のウィンドウには、 Distribution Agent Securityが表示されます。 値はすでに構成されています。 次へをクリックします 。
同期スケジュール –デフォルトのままにします。 次へをクリックします 。
サブスクリプションの初期化 –デフォルト値のままにします。 次へをクリックします 。
必要な詳細をすべて入力すると、サブスクリプションの作成プロセスを完了することができます。 スクリプトファイルの生成…を確認してください 後でスクリプトを調べて、次へをクリックするオプション 。
ファイルを保存するためのパスを指定し、次へをクリックします 。
要約を見て、構成されているすべての値を確認してください。確認したら、[完了]をクリックします 。
サブスクリプションの作成が完了しました。 閉じるをクリックします 。
これで、サブスクリプションが表示されます。 パブリケーションの下に表示されます 。
スナップショットエージェントの構成
次のステップは、スナップショットに取り組むことです。 エージェント パブリッシャーから初期データを送信する サブスクライバーへ 。
それに踏み込む前に、レプリケーションモニターに注意する必要があります。 。この重要なツールはSSMSで使用でき、さまざまなレベル、サーバーレベル、パブリッシャーデータベースレベル、サブスクリプションレベル、およびレプリケーションエージェントレベルでレプリケーションステータスを表示できます。
レプリケーションを右クリックします /ローカルパブリケーション /ローカルサブスクリプション /出版物 またはサブスクリプション レプリケーションモニターを起動するために作成しました 以下に示すように:
レプリケーションモニター 、 パブリッシャーサーバー(RRJ)>パブリケーション([AdventureWorks]:AdventureWorks_pub)を展開します サブスクリプションの詳細を表示します。 サブスクリプションを右クリックします 詳細を表示を選択します 。
ご覧のとおり、初期スナップショットに関する情報 私たちの出版物AdventureWorks_pubはまだ利用できません。 スナップショットエージェントジョブを実行して、初期データをサブスクライバデータベースに送信する必要があります 。
このウィンドウを開いたままにして、スナップショットエージェントジョブを開始した後、スナップショットの進行状況を確認します。 。
パブリケーションを右クリックします >スナップショットエージェントのステータスを表示 :
エージェントは実行されたことがありません メッセージには、スナップショットエージェントを実行したことがないことが示されています。 開始をクリックします 。
スナップショットエージェントの実行中に、進行状況を確認できます:
すべてのスナップショットが作成されると、確認メッセージが生成されます:
以前にパスを指定したSnapshotフォルダーに新しく作成されたSnapshotファイルを確認できます。
すべてのスナップショットがディストリビューションエージェントによって適用された後 サブスクライバーデータベースへ 、開いているレプリケーションモニターに以下のステータスが表示されます ウィンドウ:
おめでとうございます!スナップショットエージェントを使用してトランザクションレプリケーションを正常に構成しました。
注 :巨大なパブリッシャーデータベースがある場合、スナップショットの作成には時間がかかる場合があります。したがって、Snapshot Agentを実行する代わりに、Publisherデータベースの完全バックアップを使用することをお勧めします。この問題については、以降の記事で説明します。
レプリケーションコンポーネントの確認
すべてのレプリケーションコンポーネントは、SSMSGUIとTSQLクエリの両方で検証できます。これについては今後の記事で説明します。ここでは、以下のコンポーネントのプロパティを表示する方法について簡単に説明します。
発行者
SSMSで、レプリケーションを右クリックします >サイト運営者のプロパティ >出版物データベース :
パブリッシャーの詳細を表示するには 、ディストリビューションデータベースに対して以下のクエリを実行します。
USE distribution
GO
exec sp_helpdistpublisher
GO
select * from MSpublisher_databases
GO
サブスクライバー
サブスクライバー情報は、SSMSで以下のクエリを使用して取得できます。
USE distribution
GO
exec sp_helpsubscriberinfo
GO
select * from MSsubscriber_info
ディストリビューター
SSMSで、レプリケーションを右クリックします >ディストリビューター プロパティ :
発行者をクリックします このディストリビューションデータベースを使用しているすべてのパブリッシャーのリストを表示します。
SSMSでは、以下のクエリを実行して同じ詳細を取得できます。
USE distribution
GO
exec sp_helpdistributor
GO
exec sp_helpdistributiondb
GO
記事
パブリケーションを右クリックします >パブリケーションプロパティ >記事 。利用可能なすべての記事のリストが表示されます。個々の記事のプロパティは、記事のプロパティをクリックして変更できます。 同様に。
USE AdventureWorks
GO
-- To View all articles available under a Publication
exec sp_helparticle @publication = 'Adventureworks_pub'
GO
-- To View all article columns for a particular article available under a Publication
exec sp_helparticlecolumns @publication = 'Adventureworks_pub', @article = 'Address'
GO
USE distribution
GO
SELECT * from MSArticles
出版物
パブリケーションを右クリックします >プロパティ :
SSMSでは、以下のクエリを実行してパブリケーションプロパティを表示できます。 :
USE AdventureWorks
GO
exec sp_helppublication
GO
USE distribution
GO
SELECT * FROM MSPublications
サブスクリプション
サブスクリプションを右クリックします >サブスクリプションプロパティ :
SSMSでは、次のスクリプトを実行してサブスクリプション情報を取得できます。
USE AdventureWorks
GO
exec sp_helpsubscription
GO
USE distribution
GO
SELECT * FROM MSsubscriptions
GO
レプリケーションエージェント
SQLServerエージェントジョブの下 、特定のジョブを見つけることができます すべてのレプリケーションエージェント用に作成:
SSMSでは、クエリを実行して、必要なログリーダーエージェントジョブであるジョブを見つけることができます。 、スナップショットエージェントジョブ 、および配布エージェントのジョブ 。その上、ディストリビューションエージェントのクリーンアップジョブを見ることができます および、パブリケーションとサブスクリプションを内部で設定している間に作成されたレプリケーションに関連する他のいくつかのジョブ。
ログリーダーエージェントのしくみ
ログリーダーエージェント コミットされたすべてのデータをパブリッシャーデータベースのトランザクションログから読み取り、ディストリビューターデータベースにプッシュします。 Microsoftはトランザクションログを読み取る公式の方法を提供していませんが、 fn_dblog()のような文書化されていない関数はほとんどありません。 およびfn_dump_dblog() ログファイルからデータを読み取ることができます。ただし、これらの機能は文書化されておらず、Microsoftのサポートの対象外です。したがって、これらについてはこれ以上詳しく説明しません。
ディストリビューションエージェントがサブスクライバーデータベースにデータ変更を配信する方法
データがディストリビューションデータベースに書き込まれると、そのデータがディストリビューションテーブルにどのように格納されているかを読み取ることができます。そのために、 sp_browsereplcmdsを適用します プロシージャ– MSrepl_commands全体でレコードをフェッチします およびMSrepl_transactions テーブル。
学習のために、 Person.ContactTypeという名前の3列のテーブルを見てみましょう。 :
作成されたサブスクリプションは、以下の命名規則に従って、サブスクライバーデータベースのパブリケーションの一部であるすべての記事に対して3つの手順を作成します。
- dbo.sp_MSins_
- dbo.sp_MSupd_
- dbo.sp_MSdel_
Person.ContactTypeテーブルの記事については、サブスクライバーデータベースで作成された以下の手順を確認できます。
- dbo.sp_MSins_PersonContactType –挿入 パブリッシャーデータベースのトランザクションログからキャプチャされ、ディストリビューションデータベースに伝播された新しいレコード。
- dbo.sp_MSupd_PersonContactType –更新 パブリッシャーデータベースのトランザクションログからキャプチャされ、ディストリビューションデータベースに伝播された変更。
- dbo.sp_MSdel_PersonContactType –削除 records captured from Transaction Logs of Publisher database and then propagated to the distribution database.
Script of the dbo.sp_MSins_PersonContactType Procedure
As you can see, it’s a straightforward INSERT statement that comes out of the distribution database:
ALTER procedure [dbo].[sp_MSins_PersonContactType]
@c1 int,
@c2 nvarchar(50),
@c3 datetime
as
begin
insert into [Person].[ContactType] (
[ContactTypeID],
[Name],
[ModifiedDate]
) values (
@c1,
@c2,
@c3 )
end
GO
Script of the dbo.sp_MSupd_PersonContactType Procedure
The script relies on the Primary Key values to identify the unique record for updating:
ALTER procedure [dbo].[sp_MSupd_PersonContactType]
@c1 int = NULL,
@c2 nvarchar(50) = NULL,
@c3 datetime = NULL,
@pkc1 int = NULL,
@bitmap binary(1)
as
begin
declare @primarykey_text nvarchar(100) = ''
update [Person].[ContactType] set
[Name] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Name] end,
[ModifiedDate] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [ModifiedDate] end
where [ContactTypeID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
Begin
if exists (Select * from sys.all_parameters where object_id = OBJECT_ID('sp_MSreplraiserror') and [name] = '@param3')
Begin
set @primarykey_text = @primarykey_text + '[ContactTypeID] = ' + convert(nvarchar(100),@pkc1,1)
exec sp_MSreplraiserror @errorid=20598, @param1=N'[Person].[ContactType]', @[email protected]_text, @param3=13233
End
Else
exec sp_MSreplraiserror @errorid=20598
End
end
GO
Script of the dbo.sp_MSdel_PersonContactType Procedure
This script relies on the Primary Key values to identify a unique record for deleting records from the Subscriber :
ALTER procedure [dbo].[sp_MSdel_PersonContactType]
@pkc1 int
as
begin
declare @primarykey_text nvarchar(100) = ''
delete [Person].[ContactType]
where [ContactTypeID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
Begin
if exists (Select * from sys.all_parameters where object_id = OBJECT_ID('sp_MSreplraiserror') and [name] = '@param3')
Begin
set @primarykey_text = @primarykey_text + '[ContactTypeID] = ' + convert(nvarchar(100),@pkc1,1)
exec sp_MSreplraiserror @errorid=20598, @param1=N'[Person].[ContactType]', @[email protected]_text, @param3=13234
End
Else
exec sp_MSreplraiserror @errorid=20598
End
end
GO
This clearly explains why Transactional Replication enforces the Primary Key as a key requirement for tables to be added as part of Replication 。
Now, let’s see the Transactional Replication in action. Let’s change some data in the Publisher database. For simplicity, I’ll take the same Person.ContactType テーブル。
Executing the SELECT statement on the table yields 20 records:
Next, I INSERTed a sample record into the Person.ContactType テーブル:
And, I UPDATE the newly inserted record:
DELETE the newly inserted record from the table:
We need to verify these transactions in Replication using sp_browsereplcmds
Changes from Person.ContactType were captured from the Transactional Logs of Publisher Database (AdventureWorks ) and sent to the Distribution database in the same order. Later, it was propagated to the Subscriber Database (AdventureWorks_REPL 。
結論
Thanks for reading this long power-packed article! We have gone through a variety of topics, such as:
- Replication Architecture and Terminologies
- SQL Server Replication Types
- SQL Server Transactional Replication in Detail
- SQL Server Transactional Replication Configuration (Default approach)
- SQL Server Transactional Replication Verification
- SQL Server Transactional Replication in action
I hope that you’ve found lots of helpful information in this article. In subsequent parts, we’ll explore troubleshooting various issues that are frequently encountered in Replication, and learn how to handle them more efficiently.