針對異動複寫測量延遲及驗證連接

適用於:SQL ServerAzure SQL 受控執行個體

本主題描述如何使用複寫監視器、Transact-SQL 或 Replication Management Objects (RMO),在 SQL Server 中測量延遲及驗證異動複寫的連線。 異動複寫具有追蹤 Token 功能,該功能會提供便利的方式來計算異動複寫拓撲中的延遲並驗證「發行者」、「散發者」及「訂閱者」之間的連接。 Token (即少量的資料) 會寫入發行集資料庫的交易記錄,會標示為典型的已複寫交易並且會透過系統傳送,它可允許計算:

  • 在發行者端認可交易和在散發者端之散發資料庫插入對應的命令之間,所經過的時間。

  • 在散發資料庫中插入命令和在訂閱者端認可對應的交易之間,所經過的時間。

根據以上計算,您可以回答許多問題,包括:

  • 哪些訂閱者在接收發行者的變更時,所花費的時間最長?

  • 預期會收到追蹤 Token 的訂閱者中,哪些沒有接收到 (如果有的話)?

本主題內容

開始之前

限制事項

追蹤 Token 在停止系統時也很有幫助,包括停止所有活動並確認所有節點已接收全部尚未處理的變更。 如需詳細資訊,請參閱停止複寫拓撲 (複寫 Transact-SQL 程式設計)

若要使用追蹤 Token,您必須使用 Microsoft SQL Server 的特定版本:

  • 散發者必須是 Microsoft SQL Server 2005 (9.x) 或更新版本。

  • 發行者必須是 SQL Server 2005 (9.x) 或更新版本,或是 Oracle 發行者。

  • 對於發送訂閱,則會從發行者、散發者和訂閱者 (如果訂閱者為 Microsoft SQL Server 7.0 或更新版本) 收集追蹤 Token 統計資料。

  • 對於提取訂閱,則會從「訂閱者」收集追蹤 Token 統計資料,但只限於「訂閱者」為 SQL Server 2005 (9.x) 或更新版本的情況下。 如果訂閱者為 SQL Server 7.0 或 Microsoft SQL Server 2000 (8.x),則僅從發行者和散發者收集統計資料。

以下為另外一些應注意的問題和限制:

  • 訂閱必須為作用狀態以便接收追蹤 Token。 如果訂閱已經過初始化,則其為作用狀態。

  • 重新初始化會移除相關訂閱的所有暫止追蹤 Token。

  • 「訂閱者」僅接收初始同步處理之後建立的追蹤 Token。

  • 追蹤 Token 不會透過重新發行「訂閱者」來轉送。

  • 在容錯移轉到次要複本之後,複寫監視器就無法調整 SQL Server 發行執行個體的名稱,且會繼續在原始主要 SQL Server 執行個體名稱之下顯示複寫資訊。 在容錯移轉之後,便無法使用複寫監視器輸入追蹤 Token,但是可以在複寫監視器中看到在新發行者端使用 Transact-SQL 輸入的追蹤 Token。

使用 SQL Server 複寫監視器

如需啟動複寫監視器的詳細資訊,請參閱啟動複寫監視器

插入追蹤 Token 並檢視 Token 上的資訊

  1. 在左窗格中展開發行者群組,展開發行者,然後按一下發行集。

  2. 按一下 [追蹤 Token] 索引標籤。

  3. 按一下 [插入追蹤]

  4. 在下列資料行中檢視追蹤 Token 的經過時間: [發行者到散發者][散發者到訂閱者][延遲總計][暫止] 表示 Token 尚未到達給定點。

若要檢視先前插入之追蹤 Token 上的訊息

  1. 在左窗格中展開發行者群組,展開發行者,然後按一下發行集。

  2. 按一下 [追蹤 Token] 索引標籤。

  3. [插入的時間] 下拉式清單中選取時間。

  4. 在下列資料行中檢視追蹤 Token 的經過時間: [發行者到散發者][散發者到訂閱者][延遲總計][暫止] 表示 Token 尚未到達給定點。

    注意

    追蹤 Token 資訊與其他記錄資料的保留時間週期相同,這會由散發資料庫的記錄保留期限控制。 如需變更散發資料庫屬性的詳細資訊,請參閱檢視及修改散發者和發行者屬性

使用 TRANSACT-SQL

若要將追蹤 Token 公佈到交易式發行集

  1. (選擇性) 在發行集資料庫的發行者上,執行 sp_helppublication (Transact-SQL)。 請確認發行集存在且狀態為使用中。

  2. (選擇性) 在發行集資料庫的發行者上,執行 sp_helpsubscription (Transact-SQL)。 請確認訂閱存在且狀態為使用中。

  3. 在發行集資料庫的發行者上,執行 sp_posttracertoken (Transact-SQL),並指定 @publication。 請注意 @tracer_token_id 輸出參數的值。

若要針對異動複寫判斷延遲並驗證連接

  1. 使用上一個程序將追蹤 Token 公佈到發行集。

  2. 在發行集資料庫的發行者上,執行 sp_helptracertokens (Transact-SQL),並指定 @publication。 如此會傳回公佈到發行集的所有追蹤 Token 清單。 請注意結果集中所要的 tracer_id

  3. 在發行集資料庫的發行者上,執行 sp_helptracertokenhistory (Transact-SQL),並指定 @publication,而且針對 @tracer_id 指定步驟 2 的追蹤 Token 識別碼。 這麼做會傳回所選取追蹤 Token 的延遲資訊。

若要移除追蹤 Token

  1. 在發行集資料庫的發行者上,執行 sp_helptracertokens (Transact-SQL),並指定 @publication。 如此會傳回公佈到發行集的所有追蹤 Token 清單。 請注意結果集中要刪除之追蹤 Token 的 tracer_id

  2. 在發行集資料庫的發行者上,執行 sp_deletetracertokenhistory (Transact-SQL),並指定 @publication,且針對 @tracer_id 指定要從步驟 2 刪除的追蹤識別碼。

範例 (Transact-SQL)

這麼做會公佈追蹤 Token 記錄,並使用傳回的公佈追蹤 Token 識別碼檢視延遲資訊。

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

使用 Replication Management Objects (RMO)

若要將追蹤 Token 公佈到交易式發行集

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 TransPublication 類別的執行個體。

  3. 設定發行集的 NameDatabaseName 屬性,並將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。 如果此方法傳回 false,則表示步驟 3 中的發行集屬性定義不正確,或者該發行集不存在。

  5. 呼叫 PostTracerToken 方法。 此方法會將追蹤 Token 插入至發行集的交易記錄。

若要針對異動複寫判斷延遲並驗證連接

  1. 使用 ServerConnection 類別建立與散發者的連接。

  2. 建立 PublicationMonitor 類別的執行個體。

  3. 設定 NameDistributionDBNamePublisherNamePublicationDBName 屬性,並將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。 如果此方法傳回 false,則表示步驟 3 中的發行集監視器屬性定義不正確,或者該發行集不存在。

  5. 呼叫 EnumTracerTokens 方法。 將傳回的 ArrayList 物件轉換為 TracerToken 物件的陣列。

  6. 呼叫 EnumTracerTokenHistory 方法。 針對步驟 5 的追蹤 Token 傳遞 TracerTokenId 的值。 這麼做會以 DataSet 物件傳回所選取追蹤 Token 的延遲資訊。 如果傳回所有的追蹤 Token,則「發行者」和「散發者」之間的連接以及「散發者」和「訂閱者」之間的連接兩者都存在,且複寫拓撲可以運作。

若要移除追蹤 Token

  1. 使用 ServerConnection 類別建立與散發者的連接。

  2. 建立 PublicationMonitor 類別的執行個體。

  3. 設定 NameDistributionDBNamePublisherNamePublicationDBName 屬性,並將 ConnectionContext 屬性設定為在步驟 1 中建立的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。 如果此方法傳回 false,則表示步驟 3 中的發行集監視器屬性定義不正確,或者該發行集不存在。

  5. 呼叫 EnumTracerTokens 方法。 將傳回的 ArrayList 物件轉換為 TracerToken 物件的陣列。

  6. 呼叫 CleanUpTracerTokenHistory 方法。 傳遞其中一個值:

    • 步驟 5 追蹤 Token 的 TracerTokenId 。 這麼做會刪除所選取 Token 的資訊。

    • DateTime 物件。 這麼做會刪除所有早於指定日期和時間的 Token 資訊。