验证已复制的数据
通过事务性复制和合并复制,您可以验证订阅服务器中的数据与发布服务器中的数据是否匹配。可以对特定订阅或某一发布的所有订阅执行验证。指定下列验证类型之一,分发代理或合并代理便会在下次运行时验证数据:
- 仅行计数。此选项将验证订阅服务器上的表与发布服务器上的表的行数是否相同,但不验证行内容是否匹配。行计数验证提供了一种轻型验证方法,使您可以意识到数据的问题所在。
- 行计数和二进制校验和。除了可在发布服务器和订阅服务器上对行进行计数之外,还可使用在 Microsoft SQL Server 2000 中引入的校验和算法来计算所有数据的校验和。如果行计数失败,将不执行校验和。
- 行计数和校验和。建议不要使用此选项,此选项只适用于运行 Microsoft SQL Server 7.0 版的订阅服务器。虽然此选项与行计数和二进制校验使用相同的方法,但它使用的是 SQL Server 7.0 版中的校验和算法。有关详细信息,请参阅本主题中的“数据验证的工作机制”部分。
除了验证订阅服务器和发布服务器上的数据是否匹配之外,合并复制还提供验证每个订阅服务器上的数据是否正确分区的功能。有关详细信息,请参阅验证合并订阅服务器的分区信息。
验证数据
若要验证订阅中的所有项目,请使用 SQL Server Management Studio、存储过程或复制管理对象 (RMO)。若要验证快照和事务性发布中的各个项目,必须使用存储过程。
- Microsoft SQL Server Management Studio: 如何在订阅服务器上验证数据 (SQL Server Management Studio)
- 复制 Transact-SQL 编程:How to: Validate Data at the Subscriber (Replication Transact-SQL Programming)
- 复制管理对象 (RMO) 编程:How to: Validate Data at the Subscriber (RMO Programming)
数据验证结果
验证完成时,分发代理或合并代理将记录有关成功或失败的消息(复制不报告具体失败的行)。可以在 SQL Server Management Studio、复制监视器和复制系统表中查看这些消息。上面所列的工作机制主题说明如何运行验证和查看结果。
若要处理验证失败,请考虑以下事项:
- 配置名为**“复制: 订阅服务器未通过数据验证”**的复制警报,以便您在验证失败时得到通知。有关详细信息,请参阅如何配置预定义复制警报 (SQL Server Management Studio)。
- 验证失败是否已对您的应用程序带来问题?如果验证失败带来了问题,请手动更新数据以进行同步,或者重新初始化订阅:
- 可以使用 tablediff 实用工具来更新数据。有关如何使用此实用工具的详细信息,请参阅How to: Compare Replicated Tables for Differences (Replication Programming)。
- 有关重新初始化的详细信息,请参阅重新初始化订阅。
数据验证的注意事项
请在验证数据时考虑下列问题:
- 验证数据之前,必须停止订阅服务器上的一切更新活动(验证进行时不必停止发布服务器上的活动)。
- 因为校验和与二进制校验和在验证大型数据集时可能需要大量处理器资源,所以应将验证安排在复制中所用服务器上的活动最少时进行。
- 复制只验证表;它不验证只包含架构的项目(例如存储过程)是否在发布服务器和订阅服务器上相同。
- 可以对任何发布的表使用二进制校验和。校验和无法验证带有列筛选器的表或列偏移量不一致的逻辑表结构(由于存在用于删除或添加列的 ALTER TABLE 语句)。
- 校验和计算中不包括 text、ntext 或 image 列中的数据。
- 如果订阅服务器与发布服务器上的数据类型不同,则使用二进制校验和或校验和的验证可能会错误地报告失败。此事件可能在下列情况下发生:如果手动初始化订阅,并在订阅服务器上使用不同的数据类型;或者如果为某项目使用下列架构选项:
- 将用户定义类型映射到基本数据类型(架构选项 0x20)
- 将 xml 映射到 ntext(架构选项 0x10000000)
- 将 nvarchar(max) 和 varbinary(max) 映射到 SQL Server 的早期版本所支持的数据类型(架构选项 0x20000000)。
有关架构选项的详细信息,请参阅发布数据和数据库对象。
- 事务性复制的可转换订阅不支持二进制校验和和校验和验证。
- 复制到非 SQL Server 订阅服务器的数据不支持验证。
数据验证的工作机制
SQL Server 通过计算发布服务器上的行计数或校验和,并将这些值与订阅服务器上计算所得的行计数或校验和值比较来验证数据。为整个发布表和整个订阅表各计算一个值,但计算中不包括 text、ntext 或 image 列中的数据。
执行计算时,共享锁临时放置对其执行行计数或校验和的表上,不过计算很快完成,同时共享锁被删除,这一过程通常只需几秒钟。
使用二进制校验和时,32 位冗余校验 (CRC) 将逐列进行,而不是在数据页的物理行上进行。这使得表中的列可以按任意顺序在数据页上进行物理排序,但对该行计算的 CRC 值不变。发布上有行筛选器或列筛选器时,可使用二进制校验和进行验证。运行 SQL Server 7.0 版的订阅服务器必须使用在 SQL Server 7.0 版中发布的校验和算法,使用这些算法生成的 CRC 值与使用 SQL Server 2000 和更高版本中的算法生成的 CRC 值不同。在 SQL Server 7.0 版中发布的校验和例程无法验证带有列筛选器的表或列偏移量不一致的逻辑表结构(由于存在用于删除或添加列的 ALTER TABLE 语句)。