トランザクション レプリケーションの動作方法

トランザクション レプリケーションは、SQL Server のスナップショット エージェント、ログ リーダー エージェント、およびディストリビューション エージェントによって実装されます。スナップショット エージェントは、パブリッシュされたテーブルやデータベース オブジェクトのスキーマとデータを含むスナップショット ファイルを作成し、ファイルをスナップショット フォルダに格納して、同期ジョブをディストリビュータのディストリビューション データベースに記録します。

ログ リーダー エージェントは、トランザクション レプリケーション用に構成した各データベースのトランザクション ログを監視し、レプリケーションのマークが付けられたトランザクションをトランザクション ログから、信頼性の高いストア アンド フォワード キューとして機能するディストリビューション データベースにコピーします。ディストリビューション エージェントは、スナップショット フォルダからの初期スナップショット ファイルと、ディストリビューション データベース テーブルに保持されているトランザクションをサブスクライバにコピーします。

パブリッシャでの増分変更は、待機時間が最小となるように連続実行できるディストリビューション エージェントのスケジュールに従って、またはスケジュールされた間隔で、サブスクライバに送られます。即時更新オプションまたはキュー更新オプションなしでトランザクション レプリケーションを使用する場合、データはパブリッシャで変更されるため、更新の競合は回避されます。最終的には、すべてのサブスクライバがパブリッシャと同じ値になります。即時更新オプションまたはキュー更新オプションをトランザクション レプリケーションで使用する場合、更新はサブスクライバで行われます。キュー更新の場合、競合が発生する可能性があります。詳細については、「更新可能なサブスクリプションの動作方法」を参照してください。

次の図に、トランザクション レプリケーションの主要なコンポーネントを示します。

トランザクション レプリケーション コンポーネントとデータ フロー

初期データセット

新しいトランザクション レプリケーションでパブリッシャから増分変更を受信する前に、サブスクライバは、パブリッシャのテーブルと同じスキーマおよびデータを持つテーブルを格納する必要があります。初期データセットは、通常、スナップショット エージェントにより作成され、ディストリビューション エージェントにより配信および適用されるスナップショットです。初期データセットは、バックアップや、SQL Server Integration Services などでも提供されます。詳細については、「サブスクリプションの初期化」を参照してください。

スナップショットがサブスクライバに配信および適用されると、初期スナップショットを待っているサブスクライバだけが影響を受けます。そのパブリケーションに対するその他のサブスクライバ (既に初期化済みのもの) は影響を受けません。

同時実行スナップショット処理

スナップショット レプリケーションは、スナップショット生成中にレプリケーションの一部としてパブリッシュされたすべてのテーブルに、共有ロックをかけます。これにより、パブリッシュ テーブルで更新が行われることが防止されます。トランザクション レプリケーションでの既定である、同時実行スナップショット処理では、スナップショットの生成中に共有ロックが設定されることはありません。ユーザーはレプリケーションが初期スナップショット ファイルを作成している間も作業を継続できます。

スナップショット エージェント

スナップショット エージェントがトランザクション レプリケーションで初期スナップショットを実装する手順はスナップショット レプリケーションと同じです (ただし、上記の同時実行スナップショット処理に該当する部分は除きます)。詳細については、「スナップショット レプリケーションの動作方法」を参照してください。

スナップショット ファイルが作成されると、Microsoft Windows エクスプローラを使用してスナップショット フォルダ内のそれらのファイルを参照できます。

データの変更およびログ リーダー エージェント

ログ リーダー エージェントはディストリビュータで実行されます。通常は連続実行されますが、設定したスケジュールに従って実行することもできます。ログ リーダー エージェントを実行すると、パブリケーション トランザクション ログ (通常の SQL Server データベース エンジン動作時にトランザクションの追跡と復旧に使用するものと同じデータベース ログ) の読み取り後、レプリケーション用にマークが付けられているトランザクション内のデータに対する INSERT、UPDATE、DELETE ステートメントなどの変更が識別されます。次に、それらのトランザクションが、ディストリビュータのディストリビューション データベースにバッチでコピーされます。ログ リーダー エージェントでは、内部ストアド プロシージャ sp_replcmds を使用して、レプリケーション用にマークを付けたコマンドの次のセットをログから取得します。ディストリビューション データベースは、ストア アンド フォワード キューになります。ここから、変更をサブスクライバに送信します。コミットされたトランザクションだけがディストリビューション データベースに送信されます。

トランザクションのバッチ全体がディストリビューション データベースに正常に書き込まれるとコミットされます。ログ リーダー エージェントは、ディストリビュータへのコマンドの各バッチがコミットされた後で、sp_repldone を呼び出して、レプリケーションが最後に完了した日付をマークします。最後に、ログ リーダー エージェントは、トランザクション ログ内の削除する行をマークします。レプリケートされるのを待機している行は、削除されません。

トランザクション コマンドは、すべてのサブスクライバに反映されるまで、または、最大ディストリビューション保有期間に達するまで、ディストリビューション データベースに保持されます。サブスクライバは、トランザクションがパブリッシャで適用されたときと同じ順序でトランザクションを受信します。

ディストリビューション エージェント

ディストリビューション エージェントは、プッシュ サブスクリプションの場合はディストリビュータで実行され、プル サブスクリプションの場合はサブスクライバで実行されます。エージェントは、トランザクションをディストリビューション データベースからサブスクライバに移動します。サブスクリプションが検証対象としてマークされている場合、ディストリビューション エージェントは、パブリッシャのデータとサブスクライバのデータが一致しているかどうかも確認します。詳細については、「レプリケートされたデータの検証」を参照してください。