待機時間を計測して Connections for Transactional Replication を検証します。

適用対象: SQL ServerAzure SQL Managed Instance

このトピックでは、SQL Server でレプリケーション モニター、、またはレプリケーション管理オブジェクト (RMO) を使用し、Transact-SQL、トランザクション レプリケーションの待機時間を計測して接続を検証する方法について説明します。 トランザクション レプリケーションには、トレーサー トークン機能が用意されており、これによって簡単にトランザクション レプリケーション トポロジにおける待機時間を計測したり、パブリッシャー、ディストリビューター、およびサブスクライバーの間の接続を検証したりすることができます。 トークン (小さなデータ) は、通常のレプリケートされたトランザクションのようにマークが付けられてパブリケーション データベースのトランザクション ログに書き込まれ、システムを介して送信されることで、次の計算が可能になります。

  • パブリッシャーでコミットされるトランザクションと、ディストリビューターでディストリビューション データベース内に挿入される対応するコマンドの間での経過時間。

  • ディストリビューション データベース内に挿入されるコマンドと、サブスクライバーでコミットされる対応するトランザクションの間での経過時間。

これらの計算結果から、以下のようなさまざまな内容を特定できます。

  • 変更内容をパブリッシャーから受信するのに最も時間がかかるのはどのサブスクライバーか。

  • トレース トークンを受信することになっているサブスクライバーのうち、受信していないサブスクライバーがあるか。あるとすればどのサブスクライバーか。

このトピックの内容

始める前に

制限事項と制約事項

トレーサー トークンは、システムを停止する場合にも役立ちます。このとき、すべての処理を停止して、すべてのノードがすべての未処理の変更を受信したかどうかを検証します。 詳細については、「レプリケーション トポロジの停止 (レプリケーション Transact-SQL プログラミング)」を参照してください。

トレーサー トークンを使用するには、特定のバージョンの Microsoft SQL Server を使用する必要があります。

  • ディストリビューターは、Microsoft SQL Server 2005 (9.x) 以降である必要があります。

  • パブリッシャーは SQL Server 2005 (9.x) 以降であるか、Oracle パブリッシャーである必要があります。

  • プッシュ サブスクリプションでは、サブスクライバーが Microsoft SQL Server 7.0 以降である場合に、トレーサー トークン統計がパブリッシャー、ディストリビューター、サブスクライバーから収集されます。

  • プル サブスクリプションでは、サブスクライバーが SQL Server 2005 (9.x) 以降である場合にのみ、トレーサー トークン統計がサブスクライバーから収集されます。 サブスクライバーが SQL Server 7.0 または Microsoft SQL Server 2000 (8.x) の場合、統計情報はパブリッシャーとディストリビューターからのみ収集されます。

その他にも、次のような問題点と制限事項について注意する必要があります。

  • トレーサー トークンを受信するには、サブスクリプションをアクティブにする必要があります。 サブスクリプションは、初期化されている場合はアクティブです。

  • 再初期化を行うと、関連するサブスクリプションに対する保留中のトレーサー トークンがすべて削除されます。

  • サブスクライバーは、初期同期の完了後に作成されたトレーサー トークンのみを受信します。

  • レーサ トークンは、再パブリッシュ サブスクライバーからは転送されません。

  • セカンダリにフェールオーバーした後、レプリケーション モニターは SQL Server のパブリッシング インスタンスの名前を調整できないため、SQL Server の元のプライマリ インスタンスの名前を引き続き使ってレプリケーション情報が表示されます。 フェールオーバー後は、トレーサー トークンはレプリケーション モニターを使用して入力できませんが、新しいパブリッシャーで Transact-SQL を使用して入力されたトレース トークンがレプリケーション モニターに表示されます。

SQL Server レプリケーション モニターの使用

レプリケーション モニターの起動の詳細については、「Start the Replication Monitor」 (レプリケーション モニターの開始) を参照してください。

トレーサー トークンを挿入してトークンの情報を表示するには

  1. 左ペインでパブリッシャー グループを展開し、パブリッシャーを展開して、パブリケーションをクリックします。

  2. [トレーサー トークン] タブをクリックします。

  3. [トレーサーの挿入]をクリックします。

  4. [パブリッシャーからディストリビューターまで]列、 [ディストリビューターからサブスクライバーまで]列、および [合計待機時間]列で、トレーサー トークンの経過時間を表示します。 [保留中] と表示された場合は、トークンが特定のポイントに到達していないことを示します。

以前に挿入したトレーサー トークンの情報を表示するには

  1. 左ペインでパブリッシャー グループを展開し、パブリッシャーを展開して、パブリケーションをクリックします。

  2. [トレーサー トークン] タブをクリックします。

  3. [挿入された時間] ボックスで時間を選択します。

  4. [パブリッシャーからディストリビューターまで]列、 [ディストリビューターからサブスクライバーまで]列、および [合計待機時間]列で、トレーサー トークンの経過時間を表示します。 [保留中] と表示された場合は、トークンが特定のポイントに到達していないことを示します。

    Note

    トレーサー トークン情報は、ディストリビューション データベースの履歴保持期間の制約を受けるその他の履歴データと同じ期間保持されます。 ディストリビューション データベースのプロパティの変更方法の詳細については、「ディストリビューターとパブリッシャーのプロパティの表示および変更」を参照してください。

Transact-SQL の使用

トレーサー トークンをトランザクション パブリケーションに通知するには

  1. (省略可) パブリッシャー側のパブリケーション データベースに対して、sp_helppublication (Transact-SQL) を実行します。 パブリケーションが存在すること、および状態がアクティブであることを確認します。

  2. (省略可) パブリッシャー側のパブリケーション データベースに対して、sp_helpsubscription (Transact-SQL) を実行します。 サブスクリプションが存在すること、および状態がアクティブであることを確認します。

  3. パブリッシャー側のパブリケーション データベースに対して、sp_posttracertoken (Transact-SQL) を実行して、 @publication を指定します。 @tracer_token_id 出力パラメーターの値を確認します。

待機時間を決定し、トランザクション パブリケーションの接続を確認するには

  1. 上述の手順を使用して、トレーサー トークンをパブリケーションに通知します。

  2. パブリッシャー側のパブリケーション データベースに対して、@publication を指定して、sp_helptracertokens (Transact-SQL) を実行します。 パブリケーションに通知されたすべてのトレーサー トークンのリストが返されます。 結果セットの目的の tracer_id を確認します。

  3. パブリッシャー側のパブリケーション データベースで、@publication を指定し、@tracer_id に手順 2 のトレーサー トークン ID を指定して、sp_helptracertokenhistory (Transact-SQL) を実行します。 選択したトレーサー トークンの待機情報が返されます。

トレーサー トークンを削除するには

  1. パブリッシャー側のパブリケーション データベースに対して、@publication を指定して、sp_helptracertokens (Transact-SQL) を実行します。 パブリケーションに通知されたすべてのトレーサー トークンのリストが返されます。 結果セットの削除するトレーサー トークンの tracer_id を確認します。

  2. パブリッシャー側のパブリケーション データベースで、@publication を指定し、@tracer_id に手順 2 の削除するトレーサー トークン ID を指定して、sp_deletetracertokenhistory (Transact-SQL) を実行します。

例 (Transact-SQL)

次の例では、トレーサー トークン レコードを通知し、返された通知済みトレーサー トークンの ID を使用して待機時間情報を表示します。

DECLARE @publication AS sysname;
DECLARE @tokenID AS int;
SET @publication = N'AdvWorksProductTran'; 

USE [AdventureWorks2022]

-- Insert a new tracer token in the publication database.
EXEC sys.sp_posttracertoken 
  @publication = @publication,
  @tracer_token_id = @tokenID OUTPUT;
SELECT 'The ID of the new tracer token is ''' + 
    CONVERT(varchar,@tokenID) + '''.'
GO

-- Wait 10 seconds for the token to make it to the Subscriber.
WAITFOR DELAY '00:00:10';
GO

-- Get latency information for the last inserted token.
DECLARE @publication AS sysname;
DECLARE @tokenID AS int;
SET @publication = N'AdvWorksProductTran'; 

CREATE TABLE #tokens (tracer_id int, publisher_commit datetime)

-- Return tracer token information to a temp table.
INSERT #tokens (tracer_id, publisher_commit)
EXEC sys.sp_helptracertokens @publication = @publication;
SET @tokenID = (SELECT TOP 1 tracer_id FROM #tokens
ORDER BY publisher_commit DESC)
DROP TABLE #tokens

-- Get history for the tracer token.
EXEC sys.sp_helptracertokenhistory 
  @publication = @publication, 
  @tracer_id = @tokenID;
GO

レプリケーション管理オブジェクト (RMO) の使用

トレーサー トークンをトランザクション パブリケーションに通知するには

  1. ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。

  2. TransPublication クラスのインスタンスを作成します。

  3. パブリケーションの Name プロパティおよび DatabaseName プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。

  4. LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。 このメソッドが falseを返す場合、手順 3. でパブリケーション プロパティを不適切に設定したか、パブリケーションが存在していません。

  5. PostTracerToken メソッドを呼び出します。 このメソッドは、トレーサー トークンをパブリケーションのトランザクション ログに挿入します。

待機時間を決定し、トランザクション パブリケーションの接続を確認するには

  1. ServerConnection クラスを使用して、ディストリビューターへの接続を作成します。

  2. PublicationMonitor クラスのインスタンスを作成します。

  3. NameDistributionDBNamePublisherName、および PublicationDBName の各プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。

  4. LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。 このメソッドが falseを返す場合は、手順 3. のパブリケーション モニター プロパティが正しく定義されていないか、またはパブリケーションが存在していません。

  5. EnumTracerTokens メソッドを呼び出します。 返された ArrayList オブジェクトを TracerToken オブジェクトの配列にキャストします。

  6. EnumTracerTokenHistory メソッドを呼び出します。 手順 5. のトレーサー トークンに TracerTokenId の値を渡します。 これにより、 DataSet オブジェクトとして選択したトレーサー トークンの待機時間情報が返されます。 すべてのトレーサー トークン情報が返された場合、パブリッシャーとディストリビューターとの接続、およびディストリビューターとサブスクライバーの接続が両方とも存在し、レプリケーション トポロジは機能しています。

トレーサー トークンを削除するには

  1. ServerConnection クラスを使用して、ディストリビューターへの接続を作成します。

  2. PublicationMonitor クラスのインスタンスを作成します。

  3. NameDistributionDBNamePublisherName、および PublicationDBName の各プロパティを設定し、 ConnectionContext プロパティに手順 1. で作成した接続を設定します。

  4. LoadProperties メソッドを呼び出して、オブジェクトのプロパティを取得します。 このメソッドが falseを返す場合は、手順 3. のパブリケーション モニター プロパティが正しく定義されていないか、またはパブリケーションが存在していません。

  5. EnumTracerTokens メソッドを呼び出します。 返された ArrayList オブジェクトを TracerToken オブジェクトの配列にキャストします。

  6. CleanUpTracerTokenHistory メソッドを呼び出します。 次の値のいずれかを渡します。

    • 手順 5. のトレーサー トークンの TracerTokenId 。 これにより、選択したトークンの情報が削除されます。

    • DateTime オブジェクト。 これにより、指定した日時より古いすべてのトークンの情報が削除されます。