SQL Server 中心订阅模型(多发布单订阅)

原文: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操作正常同步!数据可以正常操作同步,但是字段增删改则有问题!!

原文地址:https://www.cnblogs.com/lonelyxmas/p/8360757.html

时间: 2024-10-09 05:21:54

SQL Server 中心订阅模型(多发布单订阅)的相关文章

sql server 主从数据库同步 利用发布 订阅是实现

发布订阅功能自SQL 2005之后就有了 配置方法可参考:http://blog.csdn.net/wanmdb/article/details/7515277 遇到问题: 1. 如果代理无法启动 ,请执行下图配置 2. sql server2008复制报错由于出现操作系统错误 3,进程无法读取文件“D:\Program Files (x86)\sql server\ReplData\ 2014年03月04日 ⁄ Sql Server ⁄ 共 625字 ⁄ 字号 小 中 大 ⁄ 暂无评论 ⁄ 阅

sql server相邻表记录交换(单双两两交换)

在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就不更新最后的单独行记录. 觉得有点意思,就试着实现一下(SQL Server),并记录下来. 创建一个diosos表. -- 如果表存在,就删除表 if object_id(N'diosos', N'U') is not null drop table diosos; -- 创建表 create t

SQL Server的权限模型

创建登录名 USE [master] GO /* For security reasons the login is created disabled and with a random password. */ /****** Object: Login [lee] Script Date: 2020/1/1 21:43:33 ******/ CREATE LOGIN login1 WITH PASSWORD=N'login1',--密码 DEFAULT_DATABASE=[TestDb],-

SQL Server 复制:事务发布(读写分离)

一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在YangJiaLeClub数据库中有表.存储过程.视图.用户定义函数,需要提供给其它程序读取放入缓存,程序需要比较及时的获取到这些数据,需要从权限和性能控制的角度出发,我采用了SQL Server的事务复制技术和timestamp,下面只讲述事务复制的搭建过程: 二.实现过程 (一) 环境信息   操作系统 IP 服务器名称 数据库版本 数据库名称 数据库帐号信息 发布服务器 Windows 10 企业版  192.1

sql server 本地复制订阅 实现数据库服务器 读写分离(转载)

转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 一. 名词解释 1.复制的 机构组成(类比报纸流通): 1).发布服务器(报社出版) 生产维护数据源,审阅所有出版数据的更改 发送给 分发服务器(邮局) 2).分发服务器 (邮局) 分发服务器包

sql server 本地复制订阅 实现数据库服务器 读写分离

原文:sql server 本地复制订阅 实现数据库服务器 读写分离 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 一. 名词解释 1.复制的 机构组成(类比报纸流通): 1).发布服务器(报社出版) 生产维护数据源,审阅所有出版数据的更改 发送给 分发服务器(邮局) 2).分发服务器 (邮局) 分发服务器包括分发数据库,并且存储元数据.历史

SQL Server复制的阶段:1级 - SQL Server复制简介

塞巴斯蒂安·梅内,2012/12/26 该系列 本文是"Stairway系列:SQL Server复制的阶梯"的一部分 SQL复制可以解决运行数据库驱动的应用程序中的许多问题.出版/订阅者模型并不完全容易理解,脚本和监控复制系统的复杂性需要考虑.在这里,最后是一系列文章,注意为所有类型的SQL Server复制生成一个无行话的方法. 级别1:SQL Server复制简介 主要条目:rep-li-ca-tion 发音:\?re-pl? - 'ka-sh?n \ 功能:名词 日期:14世纪

SQL Server复制入门(一)----复制简介

简介 SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护数据一致性.使 用复制功能不仅仅需要你对业务的熟悉,还需要对复制功能的整体有一个全面的了解,本系列文章旨在对SQL Server中的复制进行一个简单全面的探讨.(PS:在我的上篇文章中我发现某些文章的图片使用mspaint手绘更有感觉,但被很多人吐槽,因此在不 考虑个人羞耻感的前提下,本系列文章中的

SQL Server复制入门(一)----复制简介【转】

SQL Server复制入门(一)----复制简介 简介 SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护数据一致性.使用复制功能不仅仅需要你对业务的熟悉,还需要对复制功能的整体有一个全面的了解,本系列文章旨在对SQL Server中的复制进行一个简单全面的探讨.(PS:在我的上篇文章中我发现某些文章的图片使用mspaint手绘更有感觉,但被很多人吐槽