http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 11387|回复: 3

[Sql Server] sql server2005的订阅与发布功能实现数据同步效果

[复制链接]
发表于 2013-7-11 14:58:22 | 显示全部楼层 |阅读模式
数据库同步方式有很多种,这里以SQL Server 2005 为例利用数据库发布和订阅的方式来演示数据库的同步技术。由于就有一台计算机,只能在同一个服务器下两个不同的数据库之间进行数据同步进行演示。
首先我们在SQL Server 中建立两数据库 Lx_Data1 和 LxData2,并在两数据库中分别建立表t_student,脚本如下:
  1. CREATE TABLE t_student
  2. (
  3. Id INT NOT NULL,
  4. Name NVARCHAR(10) NULL,
  5. Age TINYINT NULL,
  6. School NVARCHAR (20) NULL,
  7. Class NVARCHAR (10) NULL,
  8. Score FLOAT NULL,
  9. CONSTRAINT PK_Student_Id PRIMARY KEY CLUSTERED (Id)
  10. )
复制代码
发布订阅分为两个步骤:1、发布。2订阅。首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅。发布可以发布一张表的部分数据,也可以对整张表进行发布,还可以是存储过程等等。下面来演示一下这两个操作过程:
发布
注意:发布的时候SQL Server 需要有实际的服务器名称才能连接到服务器。不支持通过服务器别名、IP地址或者其他备用名称进行连接。因此如果当前的SQL Server的连接是IP地址的话,最好断开连接,以实际的服务器名称重新进行登录。
关于这个可以看我另外一个文章
http://www.sufeinet.com/thread-4170-1-1.html

发布的具体过程如下:
1、展开SQL Server 2008 服务器下的 【复制】 节点,会发现有【本地发布】和【本地订阅】两个节点,右击【本地发布】节点,选择【新建发布】:
2012110815264412.jpg
2、如果服务器第一次进行发布设置,会弹出【发布向导】对话框,设置【分发服务器】,选择第一个:
2012110815294311.jpg
3、点击【下一步】会询问我们【启动SQL SERVER代理】的方式,由于是演示,我选则的是 手动方式:
2012110815341840.jpg
4、点击【下一步】,会出现设置【快照文件夹】对话框,我们选择默认:
2012110815370290.jpg
5、点击【下一步】,选择要发布的数据库,我们选择 数据库 Lx_Data1:
2012110815382537.jpg
6、点击【下一步】,选择【发布类型】,我们选择 【事务发布】。这里要说明一下如果您对此对话框里面的各种发布类型不是很理解,请点击这里 选择适当的复制类型
2012110815434292.jpg
7、点击【下一步】,选择数据库中的发布对象,我们的这个例子数据库只有一个表 t_student,我们选择这个表:
2012110815454285.jpg
以后有新的表和数据库时可以再添加的
8、点击【下一步】,进入【筛选表行】对话框:
2012110815482251.jpg
9、如果需要筛选表行点击【添加】就会出现如下的筛选器对话框:
2012110815493394.jpg
10、我们不做筛选,要全部同步,点击【取消】后,直接【下一步】,进入【快照代理】设置对话框:
2012110815514430.jpg
11、这里有两个选择一个是立即创建快照,一个是指定一个计划(比如可以指定xxx天xxx时间运行),我们选择第一个,并点击【下一步】进入【代理的安全性】设置:
2012110815572832.jpg
12、点击【安全性设置】,我们选择 SQL SERVER 用户:
2012110815584120.jpg
13、点击【确定】 后,返回 【代理安全性】设置对话框,继续点击【下一步】:
2012110816003349.jpg
14、点击【下一步】,我们给发布进行命名为:“Lx_Data1_Publisher” :
2012110816142063.jpg
15、点击【完成】,就会创建发布,并会显示创建发布的结果:
2012110816144040.jpg
订阅
发布完成后,我们要进行订阅,过程如下:
1、右键点击【本地订阅】节点,打开,【新建订阅向导】对话框:
2012110816171475.jpg
2、我们选择发布服务器 Lx-PC 中的数据库发布 Lx_Data1_Publisher,然后点击【下一步】:
2012110816175140.jpg
3、在【分发代理位置】对话框中,选择第一项,点击【下一步】:
2012110816185883.jpg
4、在【订阅服务器】对话框中,我们选择订阅数据库 Lx_Data2,然后点击【下一步】:
2012110816210219.jpg
5、在【分发代理安全性】对话框中,我们点击“...”,进入安全性设置,我们选则的是 SQL 帐户:
2012110816220943.jpg
6、输入帐号和密码后,点击【确定】,返回【安全性设置】对话框,点击【下一步】:
2012110816243533.jpg
7、我们选择默认的“连续运行”,点击【下一步】,进入【初始化订阅】对话框:
2012110816255529.jpg
8、初始化时间,选择 “立即” 初始化,点击【下一步】:
2012110816271533.jpg
9、不创建脚本文件,点击【下一步】:
2012110816282287.jpg
10、点击【完成】,就会创建订阅,并显示创建结果:
2012110816290981.jpg
至此,服务器的发布和订阅都已经创建成功了。我们来测试一下,此时两个数据库表中都没有任何数据,向Lx_Data1中的 t_student 表中插入两条数据:
  1. use Lx_Data1
  2. go
  3. insert into t_student values (1,'史泰龙',22,'纽约小学','一班',92)
  4. insert into t_student values (2,'施瓦辛格',23,'华盛顿小学','一班',90)
复制代码
然后我们查看两个数据库的结果:
  1. use Lx_Data1
  2. go
  3. select * from t_student

  4. use Lx_Data2
  5. go
  6. select * from t_student
复制代码
结果我们会发现数据已经同步了,如下图:
2012110816351515.jpg




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-7-11 15:39:20 | 显示全部楼层
这个做数据同步与备份还是非常好的,大家可以动手试试的。
 楼主| 发表于 2013-7-11 16:25:06 | 显示全部楼层
数据库复制涉及
  发布服务器:数据的来源服务器,维护源数据,决定哪些数据将被分发,检测哪些数据发生了修改,并将这些信息提交给分发服务器。
  分发服务器:分发服务器负责把从发布服务器拿来的数据传送至订阅服务器。
  订阅服务器:订阅服务器就是发布服务器数据的副本,接收维护数据。
  订阅类型
  推订阅:推订阅是指由发布服务器将所有发生修改过的数据复制给订阅者,这种在数据同步性价比较高的场合,推荐使用推订阅。
  拉订阅:拉订阅是指订阅服务器在经过一段时间就会向发布服务器要求复制出版数据库发生的变化的数据。
  发布,分发,订阅可以部署在独立的服务器上面也可以部署在一台sql server 上面,然而分开部署肯定能提高性能。
  复制代理:
  (1)快照代理
  快照代理在分发者上创建并存储快照文件,任务是:在分发数据库中准备已发布表的架构和初始数据以及其他对象、存储快照文件并记录出版数据库和订阅服务器之间的同步信息,快照代理运行在分发者服务器上,并与出版者相连接。每一个出版物都有自己的快照代理。与各种类型的复制一起使用。
  (2)日志阅读代理
  日志读取器代理与事务性复制一起使用。它将发布服务器上的事务日志中标记为复制的事务移至分发数据库中。使用事务性复制发布的每个数据库都有自己的日志读取器代理,该代理运行于分发服务器上并与发布服务器连接(分发服务器与发布服务器可以是同一台计算机)。
  (3)分发代理
  分发代理与快照复制和事务性复制一起使用。它将初始快照应用于订阅服务器,并将分发数据库中保存的事务移至订阅服务器。分发代理既可以运行于分发服务器(对于推送订阅),也可运行于订阅服务器(对于请求订阅)。
  (4)合并代理:   
  合并代理与合并复制一起使用。它将初始快照应用于订阅服务器,并移动和协调所发生的增量数据更改。每个合并订阅都有自己的合并代理,该代理同时连接到发布服务器和订阅服务器并对它们进行更新。合并代理既可以运行于分发服务器(对于推送订阅),也可以运行于订阅服务器(对于请求订阅)。默认情况下,合并代理将订阅服务器上的更改上载到发布服务器,然后将发布服务器上的更改下载到订阅服务器。
  (5)队列阅读代理
  队列读取器代理与包含排队更新选项的事务性复制一起使用。该代理运行于分发服务器,并将订阅服务器上所做更改移回至发布服务器。与分发代理和合并代理不同,只有一个队列读取器代理的实例为给定分发数据库的所有发布服务器和发布提供服务。
  复制类型:
  SQL SEVER提供了三大类复制类型:快照复制、事务复制、合并复制。可以在实际应用中使用相应的复制类型,每一种复制类型都在不同程序上实现数据的一致性。
  (1)快照复制
  如其名字所言,快照复制指在某一时刻给出版数据库中的出版数据照相,然后将数据复制到订阅者服务器。快照复制实现较为简单,其所复制的只是某一时刻数据库的瞬间数据,快照复制是将整个出版物传送给订阅者,就是在某一时刻将出版数据进行一次“照相”,生成一个描述出版数据库中数据的当前状态的一个文件,然后在相应的时间将其复制到订阅都的数据库上,快照复制并不是不停的监视出版数据库中发生的变化情况,它是对出版数据库进行一次扫描,把所有出版数据中的数据从源数据库送至目标数据库,而不仅仅是变化的数据。如果数据量很大,那么要复制的数据就很多。因此对网络资源要求很高,不仅要有较快的传输速度,而且要保证传输的可靠性。
  快照复制是最为简单的一种复制类型,能够在出版者和订阅者之间保证数据的一致性。快照复制通常使用在以下场合:
  在一定时间内出现大量的更改的操作,但数据总量不大,变化周期较长。
  (2)事务复制
  快照复制是将整个数据集发送给订阅服务器,由于体积大而造成复制周期较长,会形成复制滞后问题。那么事务复制使用事务日志来生成将复制到订阅服务器的事务,因为它只复制事务也就是变化,所以滞后也比快照复制低得多,因为将不断地在订阅服务器处得到及时应用。
  事务复制有三个组件:快照代理,它生成架构,数据以及跟踪复制过程所需的数据;
  分发代理:它分发快照和随后的命令;
  日志读取器代理:它读取发布数据的事务日志。
  在事务复制中,当出版数据库发生变化时,这种变化就会立即传递给订阅者。并在较短时间内完成(几秒),而不是像快照复制那样要经过很长一段时间间隔。因此,事务复制是一种接近实时地从源到目标分发数据的方法。由于某种原因事务复制的频率较高。所以必须保证在订阅者与出版者之间要有可靠的网络连接。
  (3)合并复制
  合并复制是为移动用户设计的,可以在发布服务器或是订阅服务器处执行修改,在合并代理运行时,这些修改将同步,多用于发布服务器与订阅服务都修改数据的情况下。工作原理如下:在要复制的每个表上实现触发器,并使用包含GUID列唯一标识要复制的表中的每一行。对其中的任何一个表进行修改时,都会将更改将记录一个数据表中,在合并代理运行时,它收集数据表中的GUID,这些GUID指出了在发布服务器和订阅服务器处修改过的行。对于只在发布服务器或是订阅端修改的数据则直接进行相应操作,如INSERT,UPDATE,DELETE,如果双方都有GUID则按照用户指定的方式解决冲突,默认发布服务器伏先。
发表于 2013-7-12 16:29:46 | 显示全部楼层
写的非常好啊!~
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 10:09

© 2014-2021

快速回复 返回顶部 返回列表