读书人

三级数据库配置SQLSERVER合并复制

发布时间: 2008-11-06 08:21:18 作者: liuhuituzi

如何构建高性能、可伸缩性的合并复制架构?3COME考试频道为您一步步解读,愿您在考试中取得好成绩!

当 SQL SERVER Distributor配置完成后就可以全力去配置 SQL SERVER PublisherPublisher是提供数据供设备同步复制的数据库,我们必须实现它。首先还是打开你的SQL SERVER,在资源管理器这个窗口,展开Replication这个文件夹,右击Local Publications文件夹,然后选择 New Publication.
  第一个界面还是向导界面,啥都不说了,直接点Next.
  在Distributor这个界面,是选择一个服务器当作Distributor,第一个按钮是选择本地刚刚发布的Distributor,第二个按钮是选择其他服务器的,我们选择第二个,并单击Add.
  弹出来的页面会指导你去连接一个SQL SERVER 服务器,我们选择上一篇刚刚配置的SYNCIDSTRIBUTOR然后点击Connect.
  然后就会在刚刚选择的第二个按钮的框框下看到刚刚加进来的SYNCDISTRIBUTOR了,我们选择它并点击Next.
  在Administrative Password这个界面,这个密码是用于远程的Distributor与本地的你所建立的Publisher之间的验证,我们在密码跟确认密码处输入P@ssword,然后点击Next.
  在Publication Database这个界面,我们选择ParkSurvey数据库用于发布,然后点击Next.
  在Publication Type这个界面,因为我们是用于跟SQL Mobile之间的同步,所以我们选择Merge Publication然后点击Next.
  在Subscriber Types这个界面,我们要指定一种数据库我们需要同发布数据库同步的,这里我们选择SQL Server 2005 Compact Edition然后点击Next.
  在Articles 这个界面显示的是发布的数据库要跟SQL SERVER Compact同步的,这里你将会看到列出来的供发布的表、存储过程、还有用户自定义的函数,但是只有表才可以与SQL SERVER Compact进行同步。如果你不想把整张表都发布出去供人家复制的话,你还可以筛选一些字段,这样可以减小快照跟SQL SERVER Compact的大小,当然一些敏感的数据也都得以保护了。
  当你单独选择一张表的时候你会发现右边出现了一个复选框Highlighted table is download only.如果你选择这个复选框的话那就意味着这张同步到设备的数据库的数据将不会得到跟踪,这样能大大减小服务器跟设备数据库的空间。但这也就是表示订阅者不会改变这张表的数据,这样的前提当然是订阅者不会是增加或删除或更新这张表的记录。这里我们选择Cities和Parks这两张表,将它们都标识上 Highlighted table is download only,但Survey不用这样子.然后我们选择一张表点击 Article Properties.
  在这里你可以设置表的一些全局属性,下面就是这张表的所有属性。
  仔细地看这张属性表你会发现你有五个主要的部分。第一个部分是Copy Objects and Settings to Subscriber,这里主要是设备从服务器复制表时是否复制主键、外键及关联、索引、触发器等等。这里最好都是用默认值,因为系统已经为你设置好了一切。
  在第二个 Destination Object的属性列表中,点击 Syncchronization direction这个属性,有三个值供我们选择一个是 Bidirectional,一个是Download- only to Subscriber,prohibit Subscriber changes,第三个值是Download-only to Subscriber,allow Subscriber changes。第一个值是指服务器端会跟踪同步上来的这张表并允许设备端修改、更新、添加同步上来的这张表,第二个值是指服务器端不会跟踪同步上来的这张表,并不允许设备端对这张表做任何改变,第三个值是指服务器端不会跟踪同步上来的这张表但允许设备端对它进行更改。
  我们先跳过Identification这块来直接看 Identity Range Management,这个属性块只有当你的表中包含一个自增长的列时才会存在。这里我不要去修改它,而是我想让你理解它是做什么的。很多时候数据库的表中都会包含一个自增长的列来当做一个唯一的主键,但那里有一个问题就是当服务器将这张表同步给很多设备时,当它们都在表里新增一个列的时候,它们会在表里添加相同的主键但内容却是不一样的。当它们把这些修改提交回服务器时,这时就会发生主键冲突,于是就只有一个设备的修改能提交到服务器,其他设备的修改都不能提交到服务器来。SQL SERVER解决这个问题的方法是给每个订阅者1000个自增长列的的范围,打个比方一个设备的自增长的ID范围是1~1000,另外一个就可能是1001~2000.这样的话,我们的主键就不会再起冲突了。这样的话你就不用去担心主键会冲突了,当然了,你也可以修改1000的数值让它变得更大或者更小来满足你的需求。
  接下来来看看Merging Changes这个属性块,第一个属性你可以看到的是Tracking level,默认的系统会最优化地帮你选择Row-level tracking这个值,这表明然后有两个订阅者在相同的一行的任何一个字段同时
  做了改变,Merge Agent这个冲突管理器就会自动启动,两个订阅者中只有一个订阅者可以将修改更新至服务器数据库,另外的一个订阅者的修改则自动被加入了冲突表。如果选择Column-level tracking这个值的话,它异味者如果两个订阅者修改的是同一行的不同列,那它们的修改都会被提交到供Publisher,这样的作用就是减少数据冲突。从性能上讲,Row-level tracking的性能要好过Column-level当你的表中不包含image、ntext、binary、or nvarchar(max)等类型的字段。
  当我们点击Resolver这个选项栏,或许你很惊讶,因为你并没有看到很多的内容,这个地方是选择一个管理冲突的工具,我没有选择自定义的冲突管理工具,因为我觉得默认的冲突管理器已经能够很好地解决我们的问题,选择Cancel然后点击Next.
  Article lssues这个页面提示你一个标识着唯一列的项将被加入到Publisher中的表。点击Next.

在弹出来的Add Filter这个页面,在左边的栏里你可以到表中的字段都罗列出来了,双击CityId列将它移到右边的Fileter statement,增加一个条件像CityId=1这样的,这样的话就会减小订阅用户同步数据的数量,当然这里的值你必须定义一个常量,因此这个叫做Static Filter(静态查询).
  在我们的应用中表里的数据有几百万条是一件很正常的事,但有时候设备所需要的数据却仅仅是这几百万条中的几千条,这个时候静态过滤就派上它的用场了。我们继续,先将CityId=1删除掉因为我们有更重要的条件要应用。
  如果你想减小客户端同步数据的数量,举个例子,就想我们这里的应用一样,每个用户只需同步他相应城市的数据,我们有字段CityId可以做到这个过滤,但我们不能用静态过滤,因为那只能过滤到一个城市。其实这个时候我们有个方法那就是用Parameterized Filter(参数查询).这里要求使用到 SQL SERVER的HOST_NAME()这个函数来实现这个过滤,只需将Replication对象的属性设置成HOST_NAME()所对应的值就可以了。考试大提示:你似乎可以写成下面这样的条件:
  WHERE [CityId]=CONVERT(int,HOST_NAME())
  不过很不幸的是,这样子的结果是无法创建Publication,因为HOST_NAME()的值是无法强制转换成Integer类型的。不过你可以这样写:
  CONVERT(nchar,CityId)=HOST_NAME()
  其实解决这个问题也不难,你可以执行sp_changemergearticle存储过程来替换下面的条件
  WHERE [CityId]=CONVERT(int,HOST_NAME())
  整个的执行过程如下所示:
  USE [ParkSurvey]
  EXEC sp_changemergearticle
  @publication='ParkSurveyPublication',
  @article='Cities',
  @property='subset_filterclause',
  @value='CityId=CONVERT(int,HOST_NAME())',
  @force_invalidate_snapshot=1,
  @force_reinit_subscription=1;
  GO这样做的结果是新建一个快照文件夹,但性能会比上面的好。
  最后我们来看看Add Filter页面中底部的单选按钮,对于每一张建立参数查询的表来说,你既不能在各个订阅者的HOSTNAME的值是一样的时候选择第一个按钮,也不能在各个订阅者的HOSTNAME的值不一样时选择第二个按钮,这很重要因为这样子会报错。如果每个订阅者的HOSTNAME的值是唯一的值的时候你应该选择第二个按钮。因此所有的静态查询你都必须选择第一个按钮让每一行的数据都发送给每个订阅者。点击OK,一个有查询条件的表就显示在 Filter Table Rows页面上了。
  好了,一个有同步参数的表就被建立了,下面我要教你如何与另外张表进行关联。在我们的例子里面,Cities表只让订阅者同步订阅者所对应的城市,但如果订阅者也想查看Parks表里的数据的话,这个就不能够满足我们的需求了。这里CityId是Parks的外键,我们可以扩展Cities表中的 HOSTNAME查询条件,选择Cities,点击Add按钮,然后选择 Add Join to Extend the Selected Filter.。
  Add Join菜单会列出你可以关联的所有的表
  这里,我们选择Parks做为我们要去关联的表。
  在我们的例子中,左边Filtered table column显示的是显示的主表的列,右边Joined table column显示的是想要与主表关联的列。在下面的预览文本框中你可以看到主表与它的外键是怎么关联起来的。你可以点击选择你所需要关联的列,当然你也可以手动创建它们当你们点击Write the Join statement manually.这里我们以一对多的关系关联Cities和Parks的CityId.因为CityId在各自的表中都是为主键,因此我们将下面的Unique key复选框选上。(这样子能改进同步的性能,也只有当关联的字段是主键时才有效),然后我们点击OK。
  在Filter Table Rows就能够显示我们加了同步查询条件的表跟它的关联表了,点击Next.
  在Snapshot Agent页面将会提示你是否立即建立快照,在这里你也可以点击change来修改快照代理的频率,在这个例子中我们选择14天,然后我们点击Next.
  在Agent Security页面,我们要选择快照代理线程运行在哪个账户底下,所以我们选择点击Security Settings.
  接下来的是Snapshot Agent Security 页面,选择Run under the following Windows account单选框,然后输入SYNCDOMAINsyncuser在Process account文本框中,在密码跟确认密码都输入P@ssw0rd,细心的您一定会发现,这个用户就是我们创建的域用户,在确认By impersonating the process account单选按钮已经被选上后就可以点击OK了。
  回到Agent Security这个页面,Snapshot Agent里就有我们刚刚所加入的syncuser用户了。然后我们点击Next.
  在Wizard Actions页面,我们把两个复选框的内容都选上,然后点击Next.
  在Script File Properties页面,这个页面让我们选择脚本的存放位置,我们保持默认的选择然后点击Next.
  在最后的Complete the Wizard页面,我们在Publication name那输入ParkSurveryPublication做为我们发布复制的名称,当我们确认我们填入的信息跟下面显示的信息一致时我们就可以点击Finish来完成这个Publication了.
  在Creating Publication这个页面我们就可以看到这个Publication的完成情况,我们就可以点击Close来关闭它,这样一个Publication就被建立起来了。

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.net/exam/

读书人网 >复习指导

热点推荐