测量事务复制的延迟并验证连接是否有效

本主题介绍如何使用复制监视器、Transact-SQL 或复制管理对象(RMO)测量 SQL Server 2014 中事务复制的延迟和验证连接。 事务复制提供跟踪令牌功能,它提供了一种测量事务复制拓扑中的延迟以及验证发布服务器、分发服务器和订阅服务器之间的连接的便捷方法。 令牌(一种少量数据)被写入发布数据库的事务日志,并被标记为类似于典型的复制事务,然后通过系统发送,从而可以进行计算:

  • 在发布服务器上提交的事务与分发服务器上的分发数据库中插入的相应命令之间需要多长时间。

  • 在分发数据库中插入的命令与在订阅服务器上提交的相应事务之间需要多长时间。

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

  • 哪些订阅者从发布者那里接收更改花费的时间最长?

  • 预期会接收跟踪令牌的订阅者中,有哪些尚未收到该令牌?

本主题内容

在您开始之前

局限性与限制

在静止系统(涉及停止所有活动并验证所有节点是否已收到所有未完成的更改)时,跟踪令牌也很有用。 有关详细信息,请参阅停止复制拓扑(复制 Transact-SQL 编程)

若要使用跟踪令牌,必须使用某些版本的 Microsoft SQL Server:

  • 分发服务器必须Microsoft SQL Server 2005 或更高版本。

  • 发布服务器必须是 SQL Server 2005 或更高版本或 Oracle 发布服务器。

  • 对于推送订阅,如果订阅服务器为 Microsoft SQL Server 7.0 或更高版本,则跟踪令牌统计信息将从发布服务器、分发服务器和订阅服务器收集。

  • 对于请求订阅,仅当订阅服务器为 SQL Server 2005 或更高版本时,才会从订阅服务器收集跟踪令牌统计信息。 如果订阅服务器是 SQL Server 7.0 或Microsoft SQL Server 2000,则仅从发布服务器和分发服务器收集统计信息。

还有一些其他问题和限制需要注意:

  • 订阅必须处于活动状态才能接收跟踪令牌。 如果订阅已初始化,则订阅处于活动状态。

  • 重新初始化可删除相关订阅的任何挂起跟踪令牌。

  • 订阅服务器仅接收在初始同步后创建的跟踪令牌。

  • 重新发布订阅服务器不会转发跟踪令牌。

  • 故障转移到辅助数据库后,复制监视器无法调整 SQL Server 发布实例的名称,并且将继续在 SQL Server 的原始主实例的名称下显示复制信息。 在故障转移之后,无法使用复制监视器输入跟踪令牌,但是可以在复制监视器中显示使用 Transact-SQL在新发布服务器上输入的跟踪令牌。

使用 SQL Server 复制监视器

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

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

  1. 在左窗格中展开发布者组,展开发布者,然后单击出版物。

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

  3. 单击“ 插入跟踪器”。

  4. 在以下列中查看跟踪令牌的运行时间: 发布服务器到分发服务器分发服务器到订阅服务器总延迟“待处理”值表示令牌尚未到达指定阶段。

查看之前插入的跟踪令牌的相关信息

  1. 在左窗格中展开发布者组,展开发布者,然后单击出版物。

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

  3. 插入的时间 下拉列表中选择一个时间。

  4. 在以下列中查看跟踪令牌的经过时间:发布服务器到分发服务器分发服务器到订阅服务器总延迟Pending值表示令牌尚未到达给定点。

    注释

    跟踪令牌信息将保留与其他历史数据相同的时间段,该数据由分发数据库的历史记录保留期控制。 有关更改分发数据库属性的信息,请参阅 “查看和修改分发服务器”和“发布服务器属性”。

使用 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和步骤 2 中的跟踪令牌 ID 为@tracer_id。 这会返回所选跟踪令牌的延迟信息。

删除跟踪令牌

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

  2. 在发布服务器上,对发布数据库执行 sp_deletetracertokenhistory(Transact-SQL),指定要从步骤 2 中删除的跟踪器的 @publication 和 ID,以便 @tracer_id

示例 (Transact-SQL)

此示例发布跟踪令牌记录,并使用已发布的跟踪令牌返回的 ID 来查看延迟信息。

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

USE [AdventureWorks2012]

-- 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 对象。 这会删除早于指定日期和时间的所有令牌的信息。