SQL Server 中心订阅模型(多发布单订阅)
大多数SQL Server 复制拓扑都是基于中心发布模型,它是由一个发布复制到一个或者多个订阅。另一个复制模型是中心订阅模型,它使用事务复制由多个发布复制到一个订阅中。
中心订阅模型用于从多个数据源中合并数据,例如:
》从多个数据仓库中汇总库存到企业总部的中心服务器;
》同一个公司中从持续发送远程办公数据到中心办公系统中;
》合并订单信息到同一个地方集中处理。
默认情况下,订阅通过快照代理初始化生成快照并被分发代理应用。当快照被应用时,默认情况 项目(article)属性 “名称已被使用时的操作(Action if name is in use)" 设置为 "删除先有对象并重新创建(Drop existing object and create a new one)" ,意思是当订阅中存在目标表对象时将被删除,并重新创建该对象。在中心订阅模型中,当从多个发布中应用快照时这种设置是有问题的。第一个快照应用是正常的,后续的快照应用时将会清除掉前一个快照的数据。
解决这个问题的方法是水平分区,设置静态行筛选器,设置属性 “名称已被使用时的操作”为 “删除数据,如果目标有行筛选器,仅删除与该筛选器匹配的数据(Delete data,If article has a row filter, delete only data that matches the filter)”
现在,本人使用2个分库数据,合并到另一个数据库中:
【设置水平分区标志】
默认情况下,表结构如下:
CREATE TABLE [dbo].[DemoTab](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](10) NOT NULL,
[value] [decimal](18, 4) NULL,
CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC)
)
GO
如果这样,id 自增量肯定有重复键,因此增加一个标志列 [LocationID],并如 id 列作为组合键。如下,分别在两个发布数据表中创建表。
--数据库:[TestDBSubA]
USE [TestDBSubA]
GO
CREATE TABLE [dbo].[DemoTab](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](10) NOT NULL,
[value] [decimal](18, 4) NULL,
[LocationID] INT NOT NULL DEFAULT(1)
CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC,[LocationID] ASC)
)
GO --数据库:[TestDBSubB]
USE [TestDBSubB]
GO
CREATE TABLE [dbo].[DemoTab](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](10) NOT NULL,
[value] [decimal](18, 4) NULL,
[LocationID] INT NOT NULL DEFAULT(2)
CONSTRAINT [PK_DemoTab] PRIMARY KEY CLUSTERED ([id] ASC,[LocationID] ASC)
)
GO
此时就可以使用字段 [LocationID] 来确定是不同数据库的数据了,在同一个订阅表中就不会有主键重复问题了。但是当在其中一个发布初始化时,或者操作数据时,怎么区分来自不同的发布数据库的数据呢?接下来设置静态行筛选器,非常重要!
【设置静态行筛选器】
此时可以在 数据库 [TestDBSubA] 或 [TestDBSubB] 的服务器中创建发布了,使用的是事务复制,选择需要发布的表,如下图:
下一步,设置行筛选器,筛选条件为 [LocationID]=1(这个是数据库 [TestDBSubA] 的发布),同理设置 [TestDBSubB] 的发布!
接下来一步步完成即可。还有一步重要的设置,发布表对象的属性。其实在上一步在操作中也可以设置。
【设置表项目的应用属性】
右键刚创建完成的发布,选择属性,选择项目,可以选择设置一个表或者所有表。如图:
选择设置所有表,设置属性 “名称已被使用时的操作”为 “删除数据,如果目标有行筛选器,仅删除与该筛选器匹配的数据(Delete data,If article has a row filter, delete only data that matches the filter)”
设置完成后确定推出!
同理设置 [TestDBSubB] 的发布!(注意 [LocationID] = 2)
订阅正常设置,两个发布的订阅都是同一个数据库。
先后分别初始化应用快照,正常!
现在测试,分别在两发布数据库中插入数据。
INSERT INTO [TestDBSubA].[dbo].[DemoTab]([name],[value]) SELECT 'TestDBSubA',0
INSERT INTO [TestDBSubB].[dbo].[DemoTab]([name],[value]) SELECT 'TestDBSubB',0 SELECT * FROM [TestDB].[dbo].[DemoTab]
结果合并了!!所有DML操作正常同步!数据可以正常操作同步,但是字段增删改则有问题!!
SQL Server 中心订阅模型(多发布单订阅)的更多相关文章
- SQL Server双机热备之发布、订阅实现实时同步
一.复制的功能概述 SQL Server 复制功能实现了主从库的分离,从而将主库的压力分解掉,主库就主要负责数据的更改等,而主库主要负责查询ji.另外,有了主.从库,则从另一个方面,也了一层安全性,即 ...
- Sql Server 2012 数据库同步方式 (发布、订阅)
上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数 ...
- sql server 主从数据库同步 利用发布 订阅是实现
发布订阅功能自SQL 2005之后就有了 配置方法可参考:http://blog.csdn.net/wanmdb/article/details/7515277 遇到问题: 1. 如果代理无法启动 , ...
- sql server 2014预览版发布
MSDN发布sql server2014预览版,如下图: SQL Server 2014新特性: 微软SQL Server部门主管Eron Kelly介绍,通过将交易处理放到内存中进行,新的SQL S ...
- sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理
1. 安装 Microsoft SQL Server Compact 4.0 https://www.microsoft.com/zh-cn/download/confirmation.aspx?i ...
- sql server相邻表记录交换(单双两两交换)
在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...
- SQL Server 复制:事务发布
一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...
- sql server 本地复制订阅 实现数据库服务器 读写分离(转载)
转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下S ...
- sql server 本地复制订阅 实现数据库服务器 读写分离
再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 ...
随机推荐
- [_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds
之前写过一篇<如何更好地限制一个UITextField的输入长度>,在文章最后得到的结论是可以直接使用 UIKIT_EXTERN NSString *const UITextFieldTe ...
- database software runInstaller无法看到全部的rac节点的处理方法
近期遇到一个问题:rhel5.5下 安装11.2.0.4的rac.GI安装完了没问题. 可是 database software runInstaller安装时,全部的节点在图形化界面中看不到. 搜 ...
- erlang分布式入门(一)-ping pong
erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192 ...
- Watchdog机制概述
1. Watchdog初始 Watchdog的中文的“看门狗”,有保护的意思.最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正 ...
- 【64.52%】【codeforces 697D】Puzzles
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 他们实际上控制的定义很easy5/12
尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 近期龙体欠安.非常多任务都堆着,虽 ...
- angular中通过$location获取路径(参数)的写法
以下获取与修改的 URL 以 ( http://172.16.0.88:8100/#/homePage?id=10&a=100 ) 为例 [一]获取 (不修改URL) //1.获取当前完整 ...
- dwc_otg驱动 "BUG: sleeping function called from invalid context at mm/page_alloc.c"
方案商的开发板上otg功能只能做device,硬件看过后说没有5v供电,加上后能够识别U盘了,但是内核报了错 [ 3.264000] usb 2-1: new high-speed USB devic ...
- mac在下面Apache 创 .htaccess档
在设定一个固定的链接将提下面的例子说明样题: 若您的 .htaccess 文件可写.我们能够自己主动改动它.但似乎它不可写,因此我们在下方列出了您 .htaccess 文件里应该增加的URL 重写规则 ...
- 信号、系统与滤波器设计(matlab)
0. 基本概念 AWG:Additive White(zero-mean) Gaussian,可加白噪声: AWGN:Additive White(zero-mean) Gaussian Noise ...