我可以在不中断复制的情况下从 SQL Server 复制订阅者数据库中删除特定数据吗?

Posted

技术标签:

【中文标题】我可以在不中断复制的情况下从 SQL Server 复制订阅者数据库中删除特定数据吗?【英文标题】:Can I delete specific data from SQL Server replication subscriber database without breaking replication? 【发布时间】:2016-04-24 18:16:49 【问题描述】:

情况是这样的:我们有一个 SQL Server 复制订户数据库,它从我们的一个核心 OLTP 系统接收复制数据,我们将其用作填充数据仓库的源。 (我们的 OLTP 数据库也由第三方供应商托管)。

为了提高订阅者的性能,我想删除早于我们建立的数据保留限制的数据行。我们不能在发布者数据库中执行此操作并让删除复制下来,因为这会成本过高(供应商),并且可能会加重使用前端的其他业务部门。

我想知道是否可以继续并在订阅者数据库上执行数据保留删除,而不会 (a) 以某种方式中断复制或 (b) 复制只是重新填充那些已删除的行。这可能吗?

【问题讨论】:

【参考方案1】:

是的,这是可能的。您在订阅者上删除的行将消失并保持消失。复制不会因此中断,因为在最坏的情况下,可以复制 DELETEUPDATE 语句,然后不会删除/更新任何内容(这不是错误)。

但有一个重要的警告:如果您必须重新初始化订阅(由于各种原因可能需要重新初始化,例如,如果订阅者发生数据损坏或某些 *CENSORED* 插入不应该插入的数据和复制中断),将生成一个包含已删除行的新快照,然后该快照将重新出现在订阅者上。如果有很多行要删除(很可能通过批处理),您将不得不重新运行删除并注意它们不会产生巨大的负载。

【讨论】:

【参考方案2】:

实际上,如果您从发布者数据库中删除相同的记录,复制也会中断。因为当命令尝试从订阅者中删除行时,它会给出错误,因为没有找到实际记录。

我已经在事务复制上尝试过这个。我认为更新命令也会发生同样的情况。

【讨论】:

以上是关于我可以在不中断复制的情况下从 SQL Server 复制订阅者数据库中删除特定数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用反向补丁的情况下从分支中删除旧的 Git 提交? [复制]

如何在不提交 HTML 表单的情况下从数据库中获取数据? [复制]

是否可以在不提供整个发布快照的情况下更改 SQL Server 复制筛选器?

在不使用 UTL_FILE 的情况下从 PL/SQL 中的文件读取/写入数据

如何在不复制的情况下从 N 维容器中获取可迭代范围?

在不借助 PL/SQL 的情况下从第二个表中查找相关值