2

我正在使用 SyncOrchestrator 或专门使用http://code.msdn.microsoft.com/windowsdesktop/Database-SyncSQL-Server-e97d1208将SQL Server 2008 与 ~6 个 SQL Server 2008 Express 客户端(我相信的所有 R2 客户端)同步稍作修改的基础。据我所知,这意味着所有连接都是对等点或节点。

我有 2 个范围。一种是仅下载,另一种是仅上传。仅下载范围充满了身份列,主要是因为我不知道更好,并且仍然无法将Guids作为客户端的PK引入。这并不完全重要,因为所有客户端都应该有大约 8 个左右表的精确副本,并且这些机器不会以任何方式接触这些数据,只会读取它。

仅上传范围使用 Guid,幸运的是我可以控制数据库的那部分,并且所有使用相同身份种子的 10 个客户端都无法正确同步回服务器。两个范围都使用带有批量插入和整个 9 码的默认配置,因此我在配置端不应该做任何事情来搞砸这个。

我最初没有使用 PerformPostRestoreFixup 设置所有内容,并且初始数据库将与来自主机的插入语句手动同步。这似乎很好,但似乎没有应用更新或删除。您可以放心地忽略这一点(仅用于历史准确性并证明我的无能),因为我随后使用 VS2010 数据库项目将数据库重建为仅模式并同步。然后我使用了此处概述的步骤 (http://social.microsoft.com/Forums/br/syncdevdiscussions/thread/9ac6d1a1-1565-4b82-a8d8-3d4a9ff5d07b) (同步、备份、恢复、调用 performpostrestorefixup、在 x 客户端上同步) 在我设置所有这些的开发框中,我可以看到更新和删除就好了。当我将它部署到 x 客户端时,我没有看到我认为应该的数据库镜像。

初始同步会报错并尝试再次同步所有记录。我相信这是意料之中的。在客户端上的 ApplyChangeFailed 事件期间,我将 DbConflictType.ErrorsOccurred 以外的所有内容都设置为 ApplyAction.RetryWithForceWrite。这可能是问题的根源,因为我最初认为应该这样做以强制将更改交给客户端。我希望服务器在这种情况下始终获胜,但在跟踪期间,我总是在批量插入/更新调用期间看到短语“本地获胜”。在重新申请之前我可能会看到错误,但看起来很尴尬。

我似乎遇到的唯一问题是仅下载范围。初始客户端数据库现在大约有一周的历史,如果我使用 performpostrestorefixup 步骤,我看不到任何从现在到那时应用的更新,因为我认为我应该这样做。就好像 SyncFx 几乎更喜欢客户端上的空白数据库来启动初始同步,然后所有更新似乎都可以正常应用,而不会启动任何 ApplyChangesFailed 事件。

如果有人以前见过这个或有线索去哪里,我将不胜感激。我的大脑一直在试图确定这是怎么回事。我最后的努力是将空白​​数据库部署到所有客户端并让它们开始同步。我在开发方面对此没有任何问题,但我只能测试另一个客户端以了解这是否会有所不同。除此之外,除了继续进行手动同步之外,我不知道该怎么做,这将完全破坏这个目的。我认为 PerformPostRestoreFixup 会完全缓解这个问题,但不管有没有它,我似乎都遇到了同样的问题,或者我可能没有考虑我需要做什么。

谢谢

4

1 回答 1

1

我想用我的发现报告并关闭该条目。

当我部署以前配置的客户端数据库时,我经常会以以下日志的形式收到 ApplyChangeFailed 事件:

“[05:30:41 PM] - ApplyChange 失败:TableName:,阶段:ApplyingInserts,ConflictType:LocalInsertRemoteInsert,操作:RetryWithForceWrite”

这是我认为的预期,因为它试图重新插入已经存在的数据。这应该被更改为 RetryWithForceWrite 期间的更新语句,但我发现数据没有随着发送的内容而更新。

一旦我使用完全空白的数据库启动每个客户端并在本地进行配置,所有这些错误都消失了。就好像每个客户都期望一些只有它设置的唯一 ID。我还使用 x64 构建与 x86 相比,这可能对结果有一些影响或没有影响。我希望我能确定到底发生了什么,但似乎在有疑问时,只要有可能,从绝对零开始并让同步填充数据是您最安全的选择。

于 2012-04-26T20:09:34.090 回答