为事务复制测量滞后时间和验证连接

适用于:SQL Server Azure SQL 托管实例

本主题介绍如何使用复制监视器、Transact-SQL 或复制管理对象 (RMO) 在 SQL Server 中为事务复制度量延迟和验证连接。 事务复制提供了跟踪令牌功能,可以方便地测量事务复制拓扑中的滞后时间和验证发布服务器、分发服务器及订阅服务器之间的连接。 将令牌(少量数据)写入发布数据库的事务日志中,就像标记典型的复制事务一样对其进行标记,使用令牌可以执行以下计算:

  • 计算在发布服务器上提交事务和在分发服务器上将相应命令插入分发数据库之间所间隔的时间。

  • 计算在分发数据库中插入命令和在订阅服务器上提交相应事务之间所间隔的时间。

通过这些计算可以回答许多问题,包括:

  • 哪个订阅服务器在从发布服务器接收更改时所需的时间最长?

  • 在应当收到跟踪令牌的订阅服务器中,哪些订阅服务器(如果有)没有收到跟踪令牌?

本主题内容

开始之前

限制和局限

停止系统时跟踪令牌也很有用,停止系统的过程涉及停止所有活动并验证所有节点均已收到所有尚未完成的更改。 有关详细信息,请参阅停止复制拓扑(复制 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 复制监视器

有关启动复制监视器的信息,请参阅启动复制监视器

插入跟踪令牌并查看有关令牌的信息

  1. 在左窗格中展开发布服务器组,再展开其中的一个发布服务器,然后单击其中的一个发布。

  2. 单击 “跟踪令牌” 选项卡。

  3. 单击 “插入跟踪器”

  4. 在以下列中查看跟踪令牌的运行时间: “发布服务器到分发服务器”“分发服务器到订阅服务器”“总滞后时间”。 值为 “挂起” 表示令牌尚未到达指定点。

查看有关以前插入的跟踪令牌的信息

  1. 在左窗格中展开发布服务器组,再展开其中的一个发布服务器,然后单击其中的一个发布。

  2. 单击 “跟踪令牌” 选项卡。

  3. “插入时间” 下拉列表中选择时间。

  4. 在以下列中查看跟踪令牌的运行时间: “发布服务器到分发服务器”“分发服务器到订阅服务器”“总滞后时间”。 值为 “挂起” 表示令牌尚未到达指定点。

    注意

    跟踪令牌信息的保留时间与其他历史数据的保留时间一样长,该时间由分发数据库的历史记录保持期来控制。 若要了解如何更改分发数据库属性,请参阅查看和修改分发服务器和发布服务器属性

“使用 Transact-SQL”

若要将跟踪令牌发布到事务发布

  1. (可选)在发布数据库中的发布服务器上,执行 sp_helppublication (Transact-SQL)。 请验证发布是否存在且状态是否处于活动状态。

  2. (可选)在发布数据库中的发布服务器上,执行 sp_helpsubscription (Transact-SQL)。 请验证订阅是否存在且状态是否处于活动状态。

  3. 在发布数据库中的发布服务器上,执行 sp_posttracertoken (Transact-SQL),同时指定 @publication。 请记录 @tracer_token_id 输出参数的值。

确定事务发布的滞后时间并验证连接

  1. 使用前一过程将跟踪令牌发送到发布。

  2. 在发布数据库中的发布服务器上,执行 sp_helptracertokens (Transact-SQL),同时指定 @publication。 这会返回发布到此发布的所有跟踪令牌的列表。 请记录结果集中所需的 tracer_id

  3. 在发布数据库中的发布服务器上,执行 sp_helptracertokenhistory (Transact-SQL),同时指定 @publication,以及为 @tracer_id指定步骤 2中的跟踪令牌 ID。 这会返回所选跟踪令牌的滞后时间信息。

删除跟踪令牌

  1. 在发布数据库中的发布服务器上,执行 sp_helptracertokens (Transact-SQL),同时指定 @publication。 这会返回发布到此发布的所有跟踪令牌的列表。 请记录结果集中要删除的跟踪令牌的 tracer_id

  2. 在发布数据库中的发布服务器上,执行 sp_deletetracertokenhistory (Transact-SQL),同时指定 @publication,并为 @tracer_id 指定步骤 2 中要删除的跟踪 ID。

示例 (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. 设置发布的 NameDatabaseName 属性,并将 ConnectionContext 属性设置为步骤 1 中创建的连接。

  4. 调用 LoadProperties 方法获取该对象的属性。 如果此方法返回 false,则说明步骤 3 中的发布属性定义不正确,或者此发布不存在。

  5. 调用 PostTracerToken 方法。 此方法将跟踪令牌插入到发布的事务日志中。

确定事务发布的滞后时间并验证连接

  1. 使用 ServerConnection 类创建与分发服务器的连接。

  2. 创建 PublicationMonitor 类的一个实例。

  3. 设置 NameDistributionDBNamePublisherNamePublicationDBName 属性,并将 ConnectionContext 属性设置为步骤 1 中创建的连接。

  4. 调用 LoadProperties 方法获取该对象的属性。 如果此方法返回 false,则说明步骤 3 中发布监视器的属性定义错误或此发布不存在。

  5. 调用 EnumTracerTokens 方法。 将返回的 ArrayList 对象转换为 TracerToken 对象数组。

  6. 调用 EnumTracerTokenHistory 方法。 为步骤 5 中的跟踪令牌传递 TracerTokenId 的值。 这样会将所选跟踪令牌的滞后信息作为 DataSet 对象返回。 如果返回了所有跟踪令牌信息,则发布服务器与分发服务器之间的连接和分发服务器与订阅服务器之间的连接同时存在,并且复制拓扑工作正常。

删除跟踪令牌

  1. 使用 ServerConnection 类创建与分发服务器的连接。

  2. 创建 PublicationMonitor 类的一个实例。

  3. 设置 NameDistributionDBNamePublisherNamePublicationDBName 属性,并将 ConnectionContext 属性设置为步骤 1 中创建的连接。

  4. 调用 LoadProperties 方法获取该对象的属性。 如果此方法返回 false,则说明步骤 3 中发布监视器的属性定义错误或此发布不存在。

  5. 调用 EnumTracerTokens 方法。 将返回的 ArrayList 对象转换为 TracerToken 对象数组。

  6. 调用 CleanUpTracerTokenHistory 方法。 传递以下值之一:

    • 步骤 5 中跟踪令牌的 TracerTokenId 。 这将删除选定令牌的信息。

    • DateTime 对象。 这会删除早于指定日期和时间的所有令牌的信息。