SQL Server多发布者向单订阅者复制:数据覆盖问题及配置咨询
SQL Server 数据聚合复制配置问题解答
问题1:上述理解是否正确?
是的,你的理解完全正确。默认配置的快照复制在初始化订阅时,会执行快照文件中包含的DROP TABLE和CREATE TABLE语句,这会直接清空并重建目标表。因此后续运行的快照同步会覆盖之前的目标表数据,最终仅保留最后一次快照同步的源库数据。
问题2:如何正确配置复制以实现数据聚合?理想情况下需每小时执行一次。
方案一:事务复制+自定义初始化(推荐)
- 提前手动在
DataBase_Combined中创建与源库结构完全一致的Table1、Table2、Table3,确保主键、约束等与源表匹配。 - 分别为
DataBase_A、DataBase_B、DataBase_C创建事务发布,包含各自的3张目标表。 - 配置订阅时,选择**“使用现有表”**作为初始化方式,跳过快照的表重建流程。此时事务复制会将源表的初始全量数据插入目标表,后续持续同步增量变更,且不会覆盖目标表中已有的其他源库数据。
- 若需每小时执行一次全量同步(而非实时增量),可搭配SQL Agent作业:
- 编写增量插入脚本,例如:
INSERT INTO DataBase_Combined.dbo.Table1 SELECT * FROM DataBase_A.dbo.Table1 WHERE NOT EXISTS ( SELECT 1 FROM DataBase_Combined.dbo.Table1 t WHERE t.PrimaryKeyColumn = DataBase_A.dbo.Table1.PrimaryKeyColumn ) - 创建每小时执行一次的SQL Agent作业,依次执行三个源库的数据同步脚本,避免重复插入数据。
- 编写增量插入脚本,例如:
方案二:自定义快照脚本(仅适用于全量聚合场景)
如果必须使用快照复制,可修改快照生成的.sch文件:
- 找到快照文件夹中的
Table1.sch等文件,删除其中的DROP TABLE和CREATE TABLE语句。 - 替换为仅同步数据的逻辑,例如使用
INSERT INTO ... SELECT而非重建表。 - 配置快照代理每小时生成一次快照并同步,确保每次仅追加数据而非覆盖。
注意:方案二需要手动维护快照脚本,灵活性较低,不如方案一稳定可靠。
内容的提问来源于stack exchange,提问作者Dmitriy Ryabin
相关产品推荐
相关产品推荐

