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