我们有一位客户在尝试将客户端(订阅者)同步到服务器(发布者)时收到以下错误:
2012-11-30 21:03:33.334 Percent Complete: 18
2012-11-30 21:03:33.334 Data validation failed for one or more articles. When troubleshooting, check the output log files for any errors that may be preventing data from being synchronized properly. Note that when error compensation or delete tracking functionalities are disabled for an article, non-convergence can occur.
2012-11-30 21:03:33.334 OLE DB Distributor 'EnvisionSQL\SQL2005': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
2012-11-30 21:03:33.506 Percent Complete: 0
2012-11-30 21:03:33.506 Category:NULL
Source: Merge Process
Number: -2147200953
Message: Data validation failed for one or more articles. When troubleshooting, check the output log files for any errors that may be preventing data from being synchronized properly. Note that when error compensation or delete tracking functionalities are disabled for an article, non-convergence can occur.
2012-11-30 21:03:33.521 Percent Complete: 0
2012-11-30 21:03:33.521 Category:NULL
Source: Merge Process
Number: -2147200953
Message: Article 'TB_CORE_DAILY' failed data validation (rowcount only). Rowcount actual: 80367, expected: 0.
2012-11-30 21:03:33.537 Percent Complete: 0
2012-11-30 21:03:33.537 Category:NULL
Source: Merge Process
Number: -2147200953
Message: Article 'TB_CORE_INSPECTION_VIOL' failed data validation (rowcount only). Rowcount actual: 19451, expected: 0.
服务器是2005,本地数据库引擎是2005 express。
什么可能导致实际/预期行数不匹配?
我正在尝试对此进行更多研究,所以我想我会重新点燃这个讨论,看看是否有其他人有一些意见。
我了解rowcount
验证的工作原理,但为什么我会在具有已知数据的表上收到 0 的预期值?
检查订阅者和发布者之间是否有任何冲突,并尝试解决这些冲突。
我可以在您的错误消息中看到
data validation
无法完成的操作,尽管正如您所说的publisher
和subscriber
表格具有完全相同的rowcount
.我认为这不会发生冲突,尽管您可以检查一下。
could not be verified
对于与sql 2005 中的合并复制相关的任何错误,如下所示:这完全取决于您如何设置合并复制。例如,如果你把所有东西都切成小块,这意味着每个订阅者只得到自己的份额,并且为了检查他们需要连接到主服务器的全部内容,那么在大多数情况下运行快照并不是什么大问题。
然而,如果每个人都在他们的机器上拥有一切,那么快照运行可能需要一段时间。只要有可能,我尽量不去谈那件事。
我可以说几件事,可能我不得不发布不止一个答案。
在合并复制中,您需要查看的所有内容都在数据库内部。
无论你做什么,在你做之前备份所有的表。
例如:
假设我有一个名为的服务器
ODS
并且我的所有订阅者都被命名为MERLIN SOMETHING
我的数据库被称为concord_ord
看看这个:
然后转到您的订阅者并检查那里的数据:例如:
我知道要承担很多事情。但如果您想避免运行快照,这是值得的。
在上面的这种情况下,一台服务器得到修复,一台需要重新订阅。
只是为了补充或添加到其他答案
有时您会收到一条非常毛茸茸的消息
我做的第一件事是打开冗长的:
和:
查看下面命令的最新部分,您会看到输出参数。
现在我们可以查看日志文件。
现在您可以查看生成的日志并从那里继续。示例(见下图):
作业上的命令是:
对于您的情况,我真的不能直接给您一个明确的答案,但我绝对可以使用上述这些步骤帮助您找出问题所在。
如果这听起来令人困惑,请在下面发表评论,我会尝试更具体一些。