复制模型;
SQL SERVER
使用出版和订阅这一术语来描述其复制活动,所谓出版,就是向其余数据库服务器(订阅者)复制数据,订阅就是从另外服务器(出版者)接收复制数据。虽然出版和订阅的对象都是将数据复制,但出版和订阅却并非不一样角度的同一数据操做,而是体现出必定的层次性和顺序性(老是先进行出版,再进行订阅)。
SQL SERVER
的复制组件有出版物与论文。出版者、订阅者、推订阅和拉订阅。
(1)
出版物和论文
论文是被复制的数据集合,一篇论文通常就是我们所说的表,论文是出版物的基本组成单元。出版物是论文的集合。它能够包括一个或多个论文订阅者,订阅的是出版物而不是出版物中的论文,这样可使订阅更为简单。
(2)
出版者
出版者是出版出版物的服务器。出版者服务器来维护源数据库以及有关出版物的信息。使数据可用于复制。除了决定哪些数据将被复制外,出版者要检测哪些复制数据发生了变化,并将这些变化复制到分发者的分发数据库中。
(3)
分发者
分发者是指把从出版者传递来的复制数据或事务等送至相应的订阅者的服务器,并负责维护分发数据库。
(4)
订阅者
订阅者是指存储复制数据的副本机器。且接收并维护已出版的数据的服务器,订阅者也能够对出版数据进行修改,尽管订阅者能够对数据进行修改,但它还是一个订阅者,固然订阅者也能够做为其余订阅者的出版者。
出版者、分发者、订阅者实际上并不必定指相互独立的服务器。它只是对
SQL SERVER
在复制过程当中所扮演的不一样角色的描述。
SQL SERVER
容许一台
SQL SERVER
服务器能够扮演不一样的角色。好比一台出版者的服务器既可出版出版物,也能够做为分发者来存储和传送快照复制和事务复制。在实际应用中,用户决定是否让一台服务器扮演一个或多个角色。在很大程序是基于对复制系统性能的考虑,例如,为了提升分发者从分发数据库向订阅者的数据库复制出版物的效率,下降出版者服务器的负载,用户常不容许一台服务器既扮演出版者又扮演分发者。而是让其余的服务器专站承担分发者任务,从而提升了出版者和分发者的性能。
(5)
订阅类型
推订阅和拉订阅
推订阅是指由出版者将全部发生在出版数据库的修改复制给订阅者,而没必要向订阅者发出请求,只要出版数据库发生修改,出版者就会自动把这种修改体如今订购者那里,在对数据同步性要求比较高的场合,最好使用推订阅,拉订阅是指订阅者在通过一段时间就会向出版者要求复制出版数据库发生的变化。
复制代理:
(1)
快照代理
快照代理在分发者上建立并存储快照文件,任务是:在分发数据库中准备已发布表的架构和初始数据以及其余对象、存储快照文件并记录出版数据库和订阅服务器之间的同步信息,快照代理运行在分发者服务器上,并与出版者相链接。每个出版物都有本身的快照代理。与各类类型的复制一块儿使用。
(2)
日志阅读代理
日志读取器代理与事务性复制一块儿使用。它将发布服务器上的事务日志中标记为复制的事务移至分发数据库中。使用事务性复制发布的每一个数据库都有本身的日志读取器代理,该代理运行于分发服务器上并与发布服务器链接(分发服务器与发布服务器能够是同一台计算机)。
(3)
分发代理
分发代理与快照复制和事务性复制一块儿使用。它将初始快照应用于订阅服务器,并将分发数据库中保存的事务移至订阅服务器。分发代理既能够运行于分发服务器(对于推送订阅),也可运行于订阅服务器(对于请求订阅)。
(4)
合并代理:
合并代理与合并复制一块儿使用。它将初始快照应用于订阅服务器,并移动和协调所发生的增量数据更改。每一个合并订阅都有本身的合并代理,该代理同时链接到发布服务器和订阅服务器并对它们进行更新。合并代理既能够运行于分发服务器(对于推送订阅),也能够运行于订阅服务器(对于请求订阅)。默认状况下,合并代理将订阅服务器上的更改上载到发布服务器,而后将发布服务器上的更改下载到订阅服务器。
(5)
队列阅读代理
队列读取器代理与包含排队更新选项的事务性复制一块儿使用。该代理运行于分发服务器,并将订阅服务器上所作更改移回至发布服务器。与分发代理和合并代理不一样,只有一个队列读取器代理的实例为给定分发数据库的全部发布服务器和发布提供服务。
复制类型:
SQL SEVER
提供了三大类复制类型:快照复制、事务复制、合并复制。能够在实际应用中使用相应的复制类型,每一种复制类型都在不一样程序上实现数据的一致性。
(1)
快照复制
如其名字所言,快照复制指在某一时刻给出版数据库中的出版数据照相,而后将数据复制到订阅者服务器。快照复制实现较为简单,其所复制的只是某一时刻数据库的瞬间数据,
快照复制是将整个出版物传送给订阅者,就是在某一时刻将出版数据进行一次“照相”,生成一个描述出版数据库中数据的当前状态的一个文件,而后在相应的时间将其复制到订阅都的数据库上,快照复制并非不停的监视出版数据库中发生的变化状况,它是对出版数据库进行一次扫描,把全部出版数据中的数据从源数据库送至目标数据库,而不只仅是变化的数据。若是数据量很大,那么要复制的数据就不少。所以对网络资源要求很高,不只要有较快的传输速度,并且要保证传输的可靠性。
快照复制是最为简单的一种复制类型,可以在出版者和订阅者之间保证数据的一致性。快照复制一般使用在如下场合:
在必定时间内出现大量的更改的操做,但数据总量不大,变化周期较长。
(2)
事务复制
快照复制是将整个数据集发送给订阅服务器,因为体积大而形成复制周期较长,会造成复制滞后问题。那么事务复制使用事务日志来生成将复制到订阅服务器的事务,由于它只复制事务也就是变化,因此滞后也比快照复制低得多,由于将不断地在订阅服务器处获得及时应用。
事务复制有三个组件:
快照代理,它生成架构,数据以及跟踪复制过程所需的数据;
分发代理:它分发快照和随后的命令;
日志读取器代理:它读取发布数据的事务日志。
在事务复制中,当出版数据库发生变化时,这种变化就会当即传递给订阅者。并在较短期内完成(几秒),而不是像快照复制那样要通过很长一段时间间隔。所以,事务复制是一种接近实时地从源到目标分发数据的方法。因为某种缘由事务复制的频率较高。因此必须保证在订阅者与出版者之间要有可靠的网络链接。
(3)
合并复制
合并复制是为移动用户设计的,能够在发布服务器或是订阅服务器处执行修改,在合并代理运行时,这些修改将同步,多用于发布服务器与订阅服务都修改数据的状况下。工做原理以下:在要复制的每一个表上实现触发器,并使用包含
GUID
列惟一标识要复制的表中的每一行。对其中的任何一个表进行修改时,都会将更改将记录一个数据表中,在合并代理运行时,它收集数据表中的
GUID
,这些
GUID
指出了在发布服务器和订阅服务器处修改过的行。对于只在发布服务器或是订阅端修改的数据则直接进行相应操做,如
INSERT
,
UPDATE
,
DELETE
,若是双方都有
GUID
则按照用户指定的方式解决冲突,默认发布服务器伏先。
配置复制:
不管是快照复制,事务性复制仍是合并复制,建立复制都要通过如下几个步骤:
1.
建立发布服务器。选择要发布的服务器。若是有条件的,也能够分发服务器,在这里咱们就将发布服务器和分发服务器设置在同一台计算机上。
2.
不管是发布服务器仍是订阅服务器必须开启代理服务。
3.
建立一个发布。即将须要的数据库及对象发布出来。
4.
选择一个适合本身的发布类型。
5.
设置复制代理及安全,即指定能够运行代理的用户账号。
建立可使用此发布的订阅服务器。
如今咱们的实验基于下图:
咱们将
SERVER1
上的
DB1
数据库复制到
SERVE2
服务器上
具体操做以下
:
SERVER1
上操做:实例名
----
复制
----
本地发布
-----
新建发布
咱们在这里选择将发布服务器自己做为本身的的分发服务器。下面指定一个快照文件夹,用于存放快照信息,并依次选择发布数据库
DB1
接下来指定复制类型;咱们先进行快照复制
几种发布类型前面已作讲解,具备可更新订阅的事务发布属于事务发布的一种。
在该对话框里能够指定用于在分发服务器上运行快照代理的
WINDOWS
用户。
WINDOWS
用户又称为进程账户,由于代理进程是在该账户下运行的。
此时发布成功完成,若是要修改发布属性,能够在复制
-----
本地发布
----
看到该发布
下面就能够进行订阅了,订阅能够在发布服务器上进行,也能够在订阅服务器上进行。
在订阅服务器上订阅:
SERVER2
上操做:实例名
-----
复制
--
本地订阅
----
新建订阅
在发布服务器上订阅:实例名
-----
复制
--
本地发布
------
右击属性
---
选择新建订阅
接下来的操做双方是同样的:
选择发布服务器,而后指定复制类型:咱们选择是推复制
而且给
SERVER2
选择数据库
弹出如图所示的分发代理安全性对话框。在该对话框里能够设置同步订阅时运行分发代理进程的账号:
对于推送订阅来讲,分发代理在分发服务器上运行。对于请求订阅来讲,分发代理在订阅服务器上运行。在本例使用的是推送订阅,所以应该使用发布服务器的用户
链接到分发服务器:对于推送订阅来讲,只能经过模拟进程账户来与分发服务器链接。
对于请求订阅来讲,可使用模拟账户或是
SQL SERVER
用户来链接。
链接到订阅服务器:对于推送订阅来讲,能够经过模拟进程或是
SQL SERVER
用户来链接。
对于请求订阅来讲,只能使用模拟账户来链接。
测试:
此时咱们就能够看到发布服务器中的
YG
表已经复制到了订阅服务器中。
咱们在
SERVER1
的
DB1
数据库中的
YG
表中插入一条记录,杜飞
男
29
至于事务复制和合并复制,过程大体相同只是要注意表的主键和
GUID
问题,在此再也不累述,若有疑问或不一样意见请批评指定
杜飞
2008-06-30
常见错误
;
1
.代理服务必定要事先运行
2
.若是是
GHOST
的系统,会发生计算机名和
SQL SERVER
中所能识别的服务器名称不一致的状况,则请使用如下的代码进行同步更新,
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end
再从新启动
SQL SERVER
核心服务和代理服务