SQL SERVER 使用订阅发布同步数据库(转)

一、数据库复制涉及

 1、发布服务器: 

  数据的来源服务器,维护源数据,决定哪些数据将被分发,检测哪些数据发生了修改,并将这些信息提交给分发服务器。

 2、分发服务器:

  分发服务器负责把从发布服务器拿来的数据传送至订阅服务器。

3、订阅服务器:
         订阅服务器就是发布服务器数据的副本,接收维护数据。

4、订阅类型
       推订阅
          推订阅是指由发布服务器将所有发生修改过的数据复制给订阅者,这种在数据同步性价比较高的场合,推荐使用推订阅。
       拉订阅
          拉订阅是指订阅服务器在经过一段时间就会向发布服务器要求复制出版数据库发生的变化的数据。

发布,分发,订阅可以部署在独立的服务器上面也可以部署在一台sql server 上面,然而分开部署肯定能提高性能。

二、复制代理:

  1、快照代理
  快照代理在分发者上创建并存储快照文件,任务是:在分发数据库中准备已发布表的架构和初始数据以及其他对象、存储快照文件并记录出版数据库和订阅服务器之间的同步信息,快照代理运行在分发者服务器上,并与出版者相连接。每一个出版物都有自己的快照代理。与各种类型的复制一起使用。

  2、日志阅读代理
日志读取器代理与事务性复制一起使用。它将发布服务器上的事务日志中标记为复制的事务移至分发数据库中。使用事务性复制发布的每个数据库都有自己的日志读取器代理,该代理运行于分发服务器上并与发布服务器连接(分发服务器与发布服务器可以是同一台计算机)。

  3、分发代理
分发代理与快照复制和事务性复制一起使用。它将初始快照应用于订阅服务器,并将分发数据库中保存的事务移至订阅服务器。分发代理既可以运行于分发服务器(对于推送订阅),也可运行于订阅服务器(对于请求订阅)。

  4、合并代理   
合并代理与合并复制一起使用。它将初始快照应用于订阅服务器,并移动和协调所发生的增量数据更改。每个合并订阅都有自己的合并代理,该代理同时连接到发布服务器和订阅服务器并对它们进行更新。合并代理既可以运行于分发服务器(对于推送订阅),也可以运行于订阅服务器(对于请求订阅)。默认情况下,合并代理将订阅服务器上的更改上载到发布服务器,然后将发布服务器上的更改下载到订阅服务器。

  5、队列阅读代理
队列读取器代理与包含排队更新选项的事务性复制一起使用。该代理运行于分发服务器,并将订阅服务器上所做更改移回至发布服务器。与分发代理和合并代理不同,只有一个队列读取器代理的实例为给定分发数据库的所有发布服务器和发布提供服务。

三、复制类型:

SQL SEVER提供了三大类复制类型:快照复制、事务复制、合并复制。可以在实际应用中使用相应的复制类型,每一种复制类型都在不同程序上实现数据的一致性。

  1、快照复制
如其名字所言,快照复制指在某一时刻给出版数据库中的出版数据照相,然后将数据复制到订阅者服务器。快照复制实现较为简单,其所复制的只是某一时刻数据库的瞬间数据,
快照复制是将整个出版物传送给订阅者,就是在某一时刻将出版数据进行一次“照相”,生成一个描述出版数据库中数据的当前状态的一个文件,然后在相应的时间将其复制到订阅都的数据库上,快照复制并不是不停的监视出版数据库中发生的变化情况,它是对出版数据库进行一次扫描,把所有出版数据中的数据从源数据库送至目标数据库,而不仅仅是变化的数据。如果数据量很大,那么要复制的数据就很多。因此对网络资源要求很高,不仅要有较快的传输速度,而且要保证传输的可靠性。

快照复制是最为简单的一种复制类型,能够在出版者和订阅者之间保证数据的一致性。快照复制通常使用在以下场合:
       在一定时间内出现大量的更改的操作,但数据总量不大,变化周期较长。


  2、 事务复制
快照复制是将整个数据集发送给订阅服务器,由于体积大而造成复制周期较长,会形成复制滞后问题。那么事务复制使用事务日志来生成将复制到订阅服务器的事务,因为它只复制事务也就是变化,所以滞后也比快照复制低得多,因为将不断地在订阅服务器处得到及时应用。
事务复制有三个组件:
快照代理,它生成架构,数据以及跟踪复制过程所需的数据;
分发代理:它分发快照和随后的命令;
日志读取器代理:它读取发布数据的事务日志。
在事务复制中,当出版数据库发生变化时,这种变化就会立即传递给订阅者。并在较短时间内完成(几秒),而不是像快照复制那样要经过很长一段时间间隔。因此,事务复制是一种接近实时地从源到目标分发数据的方法。由于某种原因事务复制的频率较高。所以必须保证在订阅者与出版者之间要有可靠的网络连接。

  
  3、合并复制
合并复制是为移动用户设计的,可以在发布服务器或是订阅服务器处执行修改,在合并代理运行时,这些修改将同步,多用于发布服务器与订阅服务都修改数据的情况下。工作原理如下:在要复制的每个表上实现触发器,并使用包含GUID列唯一标识要复制的表中的每一行。对其中的任何一个表进行修改时,都会将更改将记录一个数据表中,在合并代理运行时,它收集数据表中的GUID,这些GUID指出了在发布服务器和订阅服务器处修改过的行。对于只在发布服务器或是订阅端修改的数据则直接进行相应操作,如INSERT,UPDATE,DELETE,如果双方都有GUID则按照用户指定的方式解决冲突,默认发布服务器伏先。

配置复制:
无论是快照复制,事务性复制还是合并复制,创建复制都要经过以下几个步骤:
1.    创建发布服务器。选择要发布的服务器。如果有条件的,也可以分发服务器,在这里我们就将发布服务器和分发服务器设置在同一台计算机上。
2.    不论是发布服务器还是订阅服务器必须开启代理服务。
3.    创建一个发布。即将需要的数据库及对象发布出来。
4.    选择一个适合自己的发布类型。
5.    设置复制代理及安全,即指定可以运行代理的用户帐号。
创建可以使用此发布的订阅服务器。

四、发布的具体过程如下:

1、展开SQL Server 2008 服务器下的 【复制】 节点,会发现有【本地发布】和【本地订阅】两个节点,右击【本地发布】节点,选择【新建发布】:

2、如果服务器第一次进行发布设置,会弹出【发布向导】对话框,设置【分发服务器】,选择第一个:

3、点击【下一步】会询问我们【启动SQL SERVER代理】的方式,由于是演示,我选则的是 手动方式:

4、点击【下一步】,会出现设置【快照文件夹】对话框,我们选择默认:

5、点击【下一步】,选择要发布的数据库,我们选择 数据库 Lx_Data1:

6、点击【下一步】,选择【发布类型】,我们选择 【事务发布】。这里要说明一下如果您对此对话框里面的各种发布类型不是很理解,请点击这里 选择适当的复制类型

7、点击【下一步】,选择数据库中的发布对象,我们的这个例子数据库只有一个表 t_student,我们选择这个表:

8、点击【下一步】,进入【筛选表行】对话框:

9、如果需要筛选表行点击【添加】就会出现如下的筛选器对话框:

10、我们不做筛选,要全部同步,点击【取消】后,直接【下一步】,进入【快照代理】设置对话框:

11、这里有两个选择一个是立即创建快照,一个是指定一个计划(比如可以指定xxx天xxx时间运行),我们选择第一个,并点击【下一步】进入【代理的安全性】设置:

12、点击【安全性设置】,我们选择 SQL SERVER 用户:

13、点击【确定】 后,返回 【代理安全性】设置对话框,继续点击【下一步】:

14、点击【下一步】,我们给发布进行命名为:“Lx_Data1_Publisher” :

15、点击【完成】,就会创建发布,并会显示创建发布的结果:

订阅

发布完成后,我们要进行订阅,过程如下:

1、右键点击【本地订阅】节点,打开,【新建订阅向导】对话框:

2、我们选择发布服务器 Lx-PC 中的数据库发布 Lx_Data1_Publisher,然后点击【下一步】:

3、在【分发代理位置】对话框中,选择第一项,点击【下一步】:

4、在【订阅服务器】对话框中,我们选择订阅数据库 Lx_Data2,然后点击【下一步】:

5、在【分发代理安全性】对话框中,我们点击“...”,进入安全性设置,我们选则的是 SQL 帐户:

6、输入帐号和密码后,点击【确定】,返回【安全性设置】对话框,点击【下一步】:

7、我们选择默认的“连续运行”,点击【下一步】,进入【初始化订阅】对话框:

8、初始化时间,选择 “立即” 初始化,点击【下一步】:

9、不创建脚本文件,点击【下一步】:

10、点击【完成】,就会创建订阅,并显示创建结果:

至此,服务器的发布和订阅都已经创建成功了。我们来测试一下,此时两个数据库表中都没有任何数据,向Lx_Data1中的 t_student 表中插入两条数据:

use Lx_Data1
go
insert into t_student values (1,‘史泰龙‘,22,‘纽约小学‘,‘一班‘,92)
insert into t_student values (2,‘施瓦辛格‘,23,‘华盛顿小学‘,‘一班‘,90)

然后我们查看两个数据库的结果:

use Lx_Data1
go
select * from t_student

use Lx_Data2
go
select * from t_student

结果我们会发现数据已经同步了,如下图:

五、注意事项

1、无论是发布复制还是订阅服务 一定要在sql server安装的服务器本机操作,不能是远程连接操作

2、将这个文件夹共享出来,然户用共享文件夹的UNC路径作为快照文件夹路径。这个文件夹要赋予SQL Server Service和Agent Service读写权限。

3、sql server 另外一种镜像实现数据副本,镜像是只能主服务器读写,从服务器是不支持读写的,而复制是可以从服务器读 主服务器写。所以我们实现读写分离往往是通过数据库的复制来实现。

4、UNC 可以做的网络驱动映射或者FTP连接

5、再发布服务器设置订阅的时候 系统会提示使用计算机名,而在不同的网络内计算机名不可以直接访问,这个时候需要设置别名,别名要注意64 client 和32client都要加

时间: 2024-10-12 15:04:43

SQL SERVER 使用订阅发布同步数据库(转)的相关文章

SQL SERVER 2012 使用订阅发布同步数据库

软件做大了,客户就多了,一个数据库服务器是远远不够的,当有一台数据服务器卦掉,那整个系统就会崩溃,所以必须考虑到数据库的自动同步与备份,当一台数据库服务 器宕机,自然就有用一台数据服务器启动起来保证整个软件系统的可用性.备份数据库与总数据库之间既统一又独立.这就是业务,技术服务于业务,那么摆在我们面前的问题是 如何让数据既统一又独立?其实SQLServer已经为我们提供了很好的解决方案:发布.订阅. 打开SQL Server2012的对象资源管理器我们可以看到里面有一个"复制"节点.(

转---SQL SERVER 2008 利用发布订阅方式实现数据库同步

转自:http://www.cnblogs.com/lxblog/archive/2012/11/08/2760650.html 数据库同步方式有很多种,这里以SQL Server 2008 为例利用数据库发布和订阅的方式来演示数据库的同步技术.由于就有一台计算机,只能在同一个服务器下两个不同的数据库之间进行数据同步进行演示. 首先我们在SQL Server 中建立两数据库 Lx_Data1 和 LxData2,并在两数据库中分别建立表t_student,脚本如下: CREATE TABLE t

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

原文:SQL Server 中心订阅模型(多发布单订阅) 大多数SQL Server 复制拓扑都是基于中心发布模型,它是由一个发布复制到一个或者多个订阅.另一个复制模型是中心订阅模型,它使用事务复制由多个发布复制到一个订阅中. 中心订阅模型用于从多个数据源中合并数据,例如: >从多个数据仓库中汇总库存到企业总部的中心服务器: >同一个公司中从持续发送远程办公数据到中心办公系统中: >合并订单信息到同一个地方集中处理. 默认情况下,订阅通过快照代理初始化生成快照并被分发代理应用.当快照被应

SQL Server 复制订阅

原文:SQL Server 复制订阅 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案/高可用 概述 配置复制就没有数据库镜像和AlwaysOn的要求那么高,只需要两台服务器能通过TCP进行通讯即可,两台服务器操作系统和SQL版本都可以不完全一致,而且两台服务器也不需要加入域,所以配置复制订阅就简单多了,但是复制订阅主要是针对数据表而不能像镜像和AlwaysOn那样配置整个数据库,这也是它的缺点吧. 接下来主要除了前面介绍配置复制订阅后面还会解释一些需要注意的

SQL Server不停机移动镜像数据库

SQL Server数据库镜像是对于数据库可用性的软件解决方案.镜像在每个数据库级别被部署,并只能在完整恢复模式下工作.由于磁盘空间的问题,需要移动镜像数据库到一个不同的位置.我们想不停机.不破坏镜像来完成这个任务.需要在不同的环境做测试. 对于启用了数据库镜像的数据库的文件移动,我们只有有限的选择.常规方法如下: 破坏数据库镜像会话,通过使用Alter database或Attach Detach移动在线数据库文件到一个新的位置. 备份数据库,并在镜像服务器上恢复备份,然后重建镜像. 技术上来

sql server 2008 R2 压缩备份数据库

今天需要把一个省外项目的数据库从服务器上备份.拷贝到本机(跨地域传输数据库备份文件). 连上VPN,通过远程桌面连接,连接上服务器,发现数据库文件已经有20G以上大小了. 文件太大,公司网络也不稳定,根本不可能通过网络传输过来. 于是,把数据库的恢复模式由"完整"模式设置为"简单"模式,接着收缩数据库, 数据库瞬间由20G变成1G多点. 在SSMS中,新建查询窗口,执行数据库备份语句: --定义变量,把备份数据库的QL脚本赋值给变量 declare @SqlBack

sql server 复制表从一个数据库到另一个数据库

sql server 复制表从一个数据库到另一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 f

SQL SERVER性能分析--死锁检测数据库阻塞语句

工作中数据库经常出现内存,找了篇文章 参照CSDN,中国风(Roy)一篇死锁文章 阻塞:其中一个事务阻塞,其它事务等待对方释放它们的锁,同时会导致死锁问题. 整理人:中国风(Roy) 参照Roy_88的博客 http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx 日期:2008.07.20 ************************************************************************

SQL Server 2008 R2 下移动数据库的存储位置

使用场景:1. 该数据库增长的较大,存储磁盘空间不足:   2. 在特定情况下该数据库需要移动到另外一块磁盘上(呵呵...我的情况就是之前的磁盘要还给别人) 步骤: 1. 新建查询 SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('yourDataBaseName'); GO 查看到结果会看到数据库主文件以及日志的名称和物理存储的地址名称   2.新建查询 use master alter da