none
如何把多个发布服务器的数据复制到一个订阅服务器中 RRS feed

  • 问题

  • 我有一个订阅服务器和多个发布服务器,都有相同的数据库名称和表结构。现在需要将发布服务器中表的数据叠加复制到订阅服务器的表中,我该咋么做,我试过了快照发布但是快照只能显示一个发布服务器的数据,合并发布的话一个订阅服务器只能绑定一个发布服务器,如果企图绑定多个会得到以下错误: 由于该订阅中有一个或多个表属于另一个发布,导致无法使用初始快照来初始化他/她,因此无法删除它。请考虑在不实用快照的情况下手动初始化订阅(错误号:MSSQL_REPL-2147200976)

    2015年5月11日 7:59

答案

  • 多个发布里都有表a,那么后面的发布在初始化的时候就会覆盖你的表a,快照生成是针对一个个独立的发布的,而不是针对表,所以做法是不要把表a放到多个发布里,比如发布AA有表a,b,c,发布BB有表 c,d,e,那么对发布BB进行快照初始化,并不会影响发布AA,也就不会影响到表a


    Love SQL


    2015年5月12日 0:11
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的
    • 已标记为答案 Cris Zhang 2015年5月12日 4:45
    2015年5月12日 2:47
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的


    您好,我想再请教您一个问题,事务复制能否让订阅服务器修改的数据回发到发布服务器

    可以的,主要有两种

    1、具有可更新的事务复制

    2、合并复制


    Love SQL

    • 已标记为答案 Cris Zhang 2015年5月12日 13:11
    2015年5月12日 11:59
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的

    您好,我想再请教您一个问题,事务复制能否让订阅服务器修改的数据回发到发布服务器

    楼主你好,你还可以参考一下这个


    Love SQL

    • 已标记为答案 Cris Zhang 2015年5月13日 6:44
    2015年5月13日 2:38

全部回复

  • 发布项目属性里面有个目标表存在时的处理方法,默认是删除重建,你可以选择不做处理

    参考: sp_addarticle 的 @pre_creation_cmd 参数说明

    https://msdn.microsoft.com/zh-cn/library/ms173857.aspx

    2015年5月11日 8:43
  • 可是不删除的话 会不停的插入重复的数据,如何让发布服务器只删除自己的表的数据而不删除其他发布服务器在订阅服务器中的数据呢
    2015年5月11日 9:07
  • 那个不删除是初始化, 不是后面的数据变化

    你应该用的事务复制吧? 难道你用的快照复制?快照是每次同步的时候把数据重新传一次,通常应该是用事务复制

    2015年5月11日 10:13
  • 另外,复制的数据你可以加条件(sp_addarticle的@filter_clause), 所以你可以考虑在表中增加一列用来标识数据中那个发布服务器的,再配合条件,确保同步损失和的数据是操作自己的数据
    2015年5月11日 10:16
  • Hi ,Cris Zhang

    我估计你是同一个数据库做了两个或多个同步链 (两个或多个发布),比如同步链a中有表aa,同步链b中也有表aa

    我没有试过你这样做复制,但是理论上没有意义,一般来说同步链a中有表aa就可以了,不需要在创建同步链b的时候再次添加aa表

    sqlserver告诉你:由于同步链a中有表aa,正在进行复制,你在同步链b中又加入了表aa,这时初始化同步链b,那么表aa 需要drop掉并且把快照应用到订阅端表aa,就出错了

    请问你这样做有什么意义吗?你是想在同步链a中的数据传到表aa 的时候,同步链b的数据又传到表aa??


    Love SQL


    2015年5月11日 11:08
  • 我的确是用快照,现在希望发布服务器初始化的时候只初始化发布服务器自己的数据不需要把订阅服务器内的所有数据初始化,不知道可不可以通过项目属性里面的目标对象名称指定初始化数据,不过我的目标对象名称是灰色的无法更改不知道是为什么
    2015年5月11日 11:52
  • 我是多对一复制,将多个数据库表中的数据复制到一个数据库,合并复制似乎无法做到
    2015年5月11日 11:55
  • 2015年5月11日 11:58
  • 我是多对一复制,将多个数据库表中的数据复制到一个数据库,合并复制似乎无法做到

    楼主你好

    合并复制不是像你这样用的,你的需求我还没做过,多个数据库向同一个订阅数据库进行复制


    Love SQL


    2015年5月11日 12:02
  • 我的确是用快照,现在希望发布服务器初始化的时候只初始化发布服务器自己的数据不需要把订阅服务器内的所有数据初始化,不知道可不可以通过项目属性里面的目标对象名称指定初始化数据,不过我的目标对象名称是灰色的无法更改不知道是为什么
    2015年5月11日 12:23
  • 多个数据库复制到订阅端的一个库是可行的,分发会根据下面的信息进行命令路由

    exec sp_addsubscription 
    @publication = N'pub_A_TZR11', 
    @subscriber = N'TZR11', 
    @destination_db = N'TaskA', 

    情景:发布服务器有五个表 a,b,c,d,e  订阅端 有四个表 a,b,c,d

    如果你不想把d表进行初始化,你只需要不把d表加入到发布里面就行了,意思就是说:你可以建立两个发布,一个发布是不需要初始化的,另一个发布是需要初始化的,那么互相不影响,如果你的表a,既放在a发布,也放在b发布,那么肯定会影响


    Love SQL


    2015年5月11日 13:45
  • 另外,复制的数据你可以加条件(sp_addarticle的@filter_clause), 所以你可以考虑在表中增加一列用来标识数据中那个发布服务器的,再配合条件,确保同步损失和的数据是操作自己的数据
    我的确是用快照,现在希望发布服务器初始化的时候只初始化发布服务器自己的数据不需要把订阅服务器内的所有数据初始化,不知道可不可以通过项目属性里面的目标对象名称指定初始化数据,不过我的目标对象名称是灰色的无法更改不知道是为什么,默认名称基于表名称
    2015年5月11日 22:02
  • 多个数据库复制到订阅端的一个库是可行的,分发会根据下面的信息进行命令路由

    exec sp_addsubscription 
    @publication = N'pub_A_TZR11', 
    @subscriber = N'TZR11', 
    @destination_db = N'TaskA', 

    情景:发布服务器有五个表 a,b,c,d,e  订阅端 有四个表 a,b,c,d

    如果你不想把d表进行初始化,你只需要不把d表加入到发布里面就行了,意思就是说:你可以建立两个发布,一个发布是不需要初始化的,另一个发布是需要初始化的,那么互相不影响,如果你的表a,既放在a发布,也放在b发布,那么肯定会影响


    Love SQL



    谢谢您的耐心答复,也就是说表a不能放在多个发布中吗?我的项目现在需要多个发布项目同时发布数据到同一个表中即表a,并且不互相覆盖
    2015年5月11日 22:06
  • 多个发布里都有表a,那么后面的发布在初始化的时候就会覆盖你的表a,快照生成是针对一个个独立的发布的,而不是针对表,所以做法是不要把表a放到多个发布里,比如发布AA有表a,b,c,发布BB有表 c,d,e,那么对发布BB进行快照初始化,并不会影响发布AA,也就不会影响到表a


    Love SQL


    2015年5月12日 0:11
  • 谢谢您的回复,但是我们现在做的项目的需求就是发布数据库和订阅数据库完全一样,发布数据库将自己数据库表中的数据不断更新到订阅数据库并且每次更新只更新该发布数据库的数据不删除其他发布数据库在订阅数据库中的数据。
    2015年5月12日 1:20
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的
    • 已标记为答案 Cris Zhang 2015年5月12日 4:45
    2015年5月12日 2:47
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的

    您好,我想再请教您一个问题,事务复制能否让订阅服务器修改的数据回发到发布服务器
    2015年5月12日 11:32
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的


    您好,我想再请教您一个问题,事务复制能否让订阅服务器修改的数据回发到发布服务器

    可以的,主要有两种

    1、具有可更新的事务复制

    2、合并复制


    Love SQL

    • 已标记为答案 Cris Zhang 2015年5月12日 13:11
    2015年5月12日 11:59
  • 数据操作是根据主键,只要能保证不同的发布服务器主键不冲突,就不会有问题,否则是需要额外加列保证唯一的

    您好,我想再请教您一个问题,事务复制能否让订阅服务器修改的数据回发到发布服务器

    楼主你好,你还可以参考一下这个


    Love SQL

    • 已标记为答案 Cris Zhang 2015年5月13日 6:44
    2015年5月13日 2:38
  • 这个我之前试过,将多个分库数据合并到一个新的数据库中,但是没有成功。

    我用的是合并复制:如2个分库,每个分库建立一个合并发布,订阅都为同一个新的数据库。

    试了好几次,最后终于可以创建2个发布对应一个订阅,没有错误。

    但是订阅更改数据,2个发布只能有一个同步数据;

    2个发布更改数据,想不起来了,似乎只有1个能同步到订阅

    2015年5月20日 16:02
  • You can make data changes on both publishers but have to set proper conflict detection rules.
    2015年5月20日 16:34