【问题标题】:Empty XML Columns during SQL Server replicationSQL Server 复制期间的空 XML 列
【发布时间】:2011-03-29 13:16:52
【问题描述】:

我们在 SQL Server 上进行了合并复制设置,如下所示:办公室有一台 SQL 服务器,另一台 SQL 服务器在世界各地运行。发布者是办公室的 SQL 服务器。

在大约 1% 的情况下,我们的两个具有 XML 数据类型列(未绑定到架构)的表被复制到包含空 XML 列的行。(这仅发生在数据是从“旅行服务器”发送回家的,但话又说回来,数据似乎在那里更频繁地更改)。我们只有在产品中才有这个。环境(WAN 复制)。

我已经验证的事情:

  • 该行已复制,因为该行的最后修改日期已刷新,但 xml 列为空。当然在其他 SQL Server 上它不是空的。
  • 复制冲突 UI 中不显示任何冲突。
  • 这不是由 XML Column 中的数据大小引起的,因为有些数据非常小。
  • 通常,问题是成批出现的。 (连续8-9行的xml列为空)
  • 如果插入或更新了行,则会出现此问题。那里没有图案。
  • 问题似乎出现了,但这纯粹是我在连接较弱时的推测。 (我们发现当服务器远离时比在附近时更常发生此问题。)

对不起,如果我混淆了一些事情,我不是真正的 DBA,更多的是具有 SQL 知识的 DEV,但由于使用数据库的应用程序不断受到问题的指责(XML 列不能为空!!)我一直在努力寻找问题,而不是每次都手动修补数据(如果必须这样做,复制有什么用?)

如果有人可以帮助解决这个问题,或者至少提出一些能够调试/调查的方法,我们将不胜感激。 我在谷歌上搜索了很多,我确实找到了这个:Hot Fix。但我们确实有最新的服务包,问题似乎有点不同。

fyi:我们在本地进行了复制设置,但问题从未发生。我们还将在其上尝试 WAN 模拟器,看看是否有帮助。

谢谢

【问题讨论】:

    标签: sql xml replication


    【解决方案1】:

    编辑:我的问题现在可以使用热修复:http://support.microsoft.com/kb/2591902

    在向 Microsoft 记录此问题后,我们能够在没有缓慢链接的情况下重现该问题(非常感谢 Microsoft 称职的升级工程师)。重现与我们的场景有点不同,但突出了我们完美处理的时间问题。

    创建 2 个表 - 一父一子(具有 PK-FK 关系)

    在父表中插入 2 行

    设置复制 - 将合并代理配置为按需运行

    同步

    全部复制后:

    在 PUBLISHER 上:从父表中删除一行

    在 SUBSCRIBER 上:插入 2 行引用您在上面删除的 parentid 的数据

    插入 5 行引用将保留在表中的 parentid 的数据

    同步,合并代理将失败,再次同步,合并代理将成功

    缺少 5 行上发布者的 XML 数据。

    似乎这是 SQL Server 2005/2008 和 2008R2 中的错误。 它将在 2008 年及以后的热修复中得到解决。 (因为 SQL Server 2005 不再被更改)

    干杯。

    【讨论】:

      【解决方案2】:

      您可能希望首先在这种令人困惑的情况下贴上创可贴,以争取一些时间来全面调查和修复(或者更有可能让 MS 修复它)。 SQL Data Compare 是一个很好的工具,可能会有所帮助。

      【讨论】:

      • 我们有一个创可贴场景,但它们非常烦人,因为服务器经常在飞机上旅行,并且在城市之间有一段时间不可用。我们只为非生产服务器与 Microsoft 进行了支持电话,因此我们需要在测试中重现此问题,然后我想我们会让他们参与进来。谢谢。
      【解决方案3】:

      我想我会在这里更新,因为这个问题让我白发苍苍,我现在离解决方案有点近了。

      我终于有一些时间来解决这个问题,并设法在我们的测试环境中重现了这个问题,使用 WAN 模拟器并减慢链接并注入一些随机数据包丢失。 (为了最好地模拟服务器在海外的生产环境非常糟糕)。

      在进行了一些 SQL 跟踪和一些详细的日志记录之后,我得出以下结论: 复制带有 XML 列的行时,该过程分 2 个步骤完成。首先插入整行,但 XML 列使用空字符串。紧接着,这次使用包含数据的 XML 列进行了更新。由于链接很慢,在某些情况下会发生外键违规。 在这种情况下,Table2 依赖于 Table1。在完成表 1 的复制并开始复制表 2(插入/更新的枚举在慢速链接上需要时间)后,一些条目被添加到表 1 和表 2。因此,Table2 上的某些插入失败,因为 Table1 条目不在数据库中,只会在下一批复制。下一次复制发生时,不再发生外键违规,但是当它尝试在 Table2 中插入先前失败的行( XML 列行 )时,它的更新部分丢失了(我可以在 SQL 探查器中看到) 这就是为什么该行最终是用一个空的 XML 完成的。

      在外键上将“强制复制”设置为 false 似乎可以解决问题,但是我仍然认为整个过程应该在选项设置为 true 的情况下工作。

      为此,我与 Microsoft 记录了一个支持电话。我已将跟踪和日志发送给 Microsoft,看看他们要说什么。

      我读过这篇文章:http://msdn.microsoft.com/en-us/library/ms152529(v=SQL.90).aspx。但对我来说,将此选项设置为 false 是一种解决方法,不是吗?

      你们觉得呢?

      ps:希望这很清楚,尽力解释它。英语不是我的第一语言。

      【讨论】:

        猜你喜欢
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        相关资源
        最近更新 更多