我的订阅者数据库与发布者失去连接并过期。我的数据可以保存吗?

My subscriber database lost connection to the publisher and expired. Can my data be saved?

我有一个发布者数据库 A,我有两个订阅者数据库 B 和 C,它们订阅了 A。我的应用程序本地驻留在站点 B 和 C,通过复制,B and/or C 的更改被复制到彼此。

问题是自 2019 年 1 月 31 日起 C 停止订阅 A,站点 C 的 IT 人员不知道这件事(没有警报)。

更大的问题是,在此期间,使用 B 应用程序的人一直在输入数据,这些数据被复制回 A。与此同时,站点 C 的人一直在向数据库 C 添加数据,而 C 不是复制回来。

如果我恢复订阅,它会获取 A 处的数据并覆盖 C 处的数据,这是一个主要问题,因为我会丢失这段时间在 C 处添加的数据。由于这是健康数据,因此全部加密并存储以 xml 格式,它并不像更新丢失的数据那么简单,因为某些文件在站点 B 和 C 之间共享,这意味着它们会将数据添加到保存的 xml 树中。

例如,如果有人在站点 B 看到一位患者并输入一条注释,它会更新一个文件。但是如果同一位患者下周去 C 点,那里的护士将更新在 B 点更新的相同文件。

我不知道如何在恢复新订阅之前先同步回在 C 所做的更新。

如果有人有任何建议,将不胜感激!

我们多年来一直在使用合并复制,有时(例如在数据库更新之后)它确实会因奇怪的错误而中断,无论我们尝试什么都无法修复。在所有这些情况下,唯一有效的解决方案是重新初始化订阅,甚至删除并重新创建包含所有订阅的发布。

但是因为这是合并复制的情况,并且当没有发生同步时,新数据正在所有端(即发布者和所有订阅者)添加,我们不能简单地重新初始化订阅,因为就像你指出的那样没有同步数据在失败的订户端生成的将丢失。您的情况更加困难,因为您正在使用加密和 XML 文件来存储数据。您是否将加密的 XML 作为 BLOBs/CLOBs 存储在数据库中?

但是,我将提供对我们多次有效的解决方案。因此,如果合并复制的一个或多个端点失败,则必须采取以下步骤:

  1. 使用 Microsoft 的 Red Gate SQL Data Compare (commercial with free 14-day trial) or free SQL Server Data Tools (SSDT) 等工具将非同步数据手动添加到所有端点。 Red Gate 的工具非常强大。您可以在数据库之间定义 tables/columns 的自定义映射以进行比较。而此时 MS 的 SSDT 只能比较具有相同名称和相同模式名称的表。这两种工具都可以生成 insert/update/delete 脚本来同步您的数据。他们甚至会自动禁用然后恢复外键约束检查。

  2. 更改您的出版物并将所有文章的 Action if name is in use 属性 设置为 保持现有对象不变

  3. 重新初始化订阅。

在您执行第 2 步并重新启动订阅复制代理后,它仍然需要时间来处理现有记录(并且根据数据集大小,可能需要相当长的时间,因此请考虑向文章添加日期过滤器)但是它不会更改任何数据,如果发布者和订阅者数据库在步骤#1 之后完全同步,则不会发生删除或插入。代理只会将这些现有记录标记为已处理,以便在以后的运行中跳过它们,因此您只会在复制监视器上看到更新命令计数增加。重新初始化订阅后,您应该没问题,任何一方生成的新数据都会同步。

您的案例很困难,因为您无法从第 1 步轻松执行手动数据同步。但这是先决条件,您需要考虑如何做到这一点。您没有提供有关如何实际存储加密数据的详细信息,因此我无法建议详细的计划,但您需要以某种方式手动解密现有的 XML 记录,插入丢失的部分然后再次加密并确保加密列各方平等。

希望这可以帮助您解决问题。

PS。不管怎样,我既不隶属于 Red Gate,也不隶属于 Microsoft。