0

我们有一个合并发布,它在大约 80 篇文章中使用了一系列复制方法(一个表上的主机名过滤,其他几个表的连接过滤;一些表使用双向同步方向,另一些表使用“仅下载,禁止订阅者更改”;一些使用身份范围管理的表,其他人不需要它)。

我们正在使用推送复制到已经拥有所有必要表的订阅者数据库,因此我们使用“删除数据”来执行“如果名称正在使用中的操作”。这些表在订阅者和发布数据库上具有相同的架构,但在复制启动之前都是空的。

问题是订阅的初始化有时需要约 3 分钟,但有时会在约 20 分钟后超时,使用相同的模板订阅数据库和相同的起始数据集(约 10,000 条记录)。初始化后,同步时,不再需要约 5 秒,而是再次需要约 20 分钟。查看复制监视器中的历史记录,同步历史记录表明它正在进行 1000 次模式更改(即使没有数据更改)。

我打开详细日志记录以查看架构更改是什么,它似乎在所有表中反复循环,关闭所有约束,然后再次打开。我不知道为什么要这样做。

请注意是否相关:我一直使用 100 个字符的 unicode 字符串(从完整的 unicode 字符范围随机创建)作为不同订阅者的 host_name。我怀疑这可能是导致问题的原因,但我已经使用 50 个字符的小写字母字符串重现了该问题。

最后,所有服务器都托管在同一个数据中心,所以我认为网络延迟不是问题。

4

2 回答 2

0

如果有人遇到这种情况,这里是解决方案:

当我们提供一个新的“订阅者”时,我们在表中为该订阅者创建了一组新数据(基于默认值)。但是,我们在创建这个新的数据副本时采取了捷径;我们关闭了所有约束,然后进行了选择..插入,然后重新打开了约束。这是因为有很多表有很多约束,我们不想遍历右边的每个表(此外,我们知道我们要添加完整性良好的数据)。

问题是,关闭所有约束,然后重新打开,合并复制会记录为两个模式更改。(而不是“无”)。因此,每次我们添加订阅者时,我们都会创建大量的架构更改。下次任何订阅者同步时 - 它必须发送所有这些毫无意义的约束开/关。

由于我们快捷方式的特殊性,它实际上为每个新订阅者添加了两个以上这样的架构更改。因此,如果订阅者有一段时间没有同步,最终会有数千个新的架构更改。

除非我们刷新快照,否则新订阅者在创建后就会有一个过时的模式,因此新订阅需要越来越长的时间直到它们开始超时。

解决方案:删除“快捷方式”并以正确的顺序复制数据,而不触及约束。没有进一步的问题。

于 2014-02-10T22:17:00.857 回答
-1

如果是合并复制。问题是:您的发布者和订阅者数据库是否完全相同?在您的情况下,您应该使用网络共享而不是 ftp 来传输快照?

于 2013-12-23T13:32:03.610 回答