塞巴斯蒂安 2012/12/26web
该系列sql
本文是楼梯系列的一部分:SQL Server复制的阶梯数据库
SQL复制能够解决运行数据库驱动的应用程序中的许多问题。发布/订阅模型并不彻底容易理解,脚本和监控复制系统的复杂性须要一些思考。在这里,最后是一系列的文章,这些文章将会为全部类型的SQL服务器复制提供一种无术语的方法。安全
Main Entry: rep-li-ca-tion Pronunciation: \?re-pl?-'ka-sh?n\ Function: noun Date: 14th century
“复制”这个词来源于拉丁语“复制”,意思是重复。复制描述了复制或复制的过程(www.merriam - webster.com)。服务器
SQL Server中的复制就是这样作的;它复制或复制数据。任什么时候候,您须要建立数据的副本,或复制该数据的更改,均可以使用复制。该副本能够在相同的数据库中建立,也能够在独立服务器上的远程位置建立。网络
该副本能够与源数据保持同步,或按预约的时间间隔同步。单向同步和双向同步是可能的。复制甚至能够用来使几个数据集保持同步。sqlserver
在第一个级别中,我将介绍基本的复制组件,并描述它们如何协同工做,以容许您复制数据和数据更改。咱们还将查看设置简单复制场景的详细示例。测试
复制组件ui
SQL Server复制由三个组件组成:发布者、分发服务器和订阅者。这些组件做用于出版物和订阅中定义的文章。spa
物品
对于应该复制的每一个SQL Server对象,须要定义复制文章。每一篇文章都对应一个SQL Server对象,或者一个对象的一个子集。被复制的对象一般是表、视图和存储过程。对于能够复制的对象的完整列表,能够在线查看图书的发布数据和数据库对象。一篇文章的属性决定了文章是否包含整个对象,或者是否通过筛选的对象子集组成了复制的文章。经过一些限制,能够在单个对象上建立多个文章。
出版
一组逻辑上属于一块儿的文章能够合并成一个出版物。该出版物有定义适用于该出版物中的全部文章的选项。发行版定义的主要选项是要使用的复制类型。
出版商
用于复制的发布的SQL服务器实例称为发布者。
发布者监视全部更改的文章,并向分发服务器提供有关更改的信息。
经销商
该分发服务器是SQL Server实例,它跟踪全部订阅者,并对全部已发布的更改进行跟踪,并确保每一个订阅者都获得每一个更改的通知。大多数更改都在分发数据库中进行跟踪。分发服务器能够是一个单独的SQL服务器实例,但分发服务一般与发布服务器运行在同一台机器上。
订阅者
订阅者是经过订阅接收全部已发布信息的SQL服务器实例。
订阅
订阅是出版物的副本。订阅定义了哪一个服务器(订阅者)将接收发布中发布的更新。每一个订阅在一个发布和一个订阅者之间建立一个连接。订阅有两种类型:推送订阅和吸引订阅。在推送订阅中,分销商直接更新订阅者数据库中的数据。在pull订阅中,订阅服务器按期向分发服务器询问是否有任何新的更改,而后更新数据自己。
复制类型
在SQL Server中有三种主要的复制类型。它们是快照复制、合并复制和事务复制。
快照复制
快照复制在每次运行时建立复制对象及其数据的完整副本。它使用sqlserver的BCP实用程序将每一个表的内容写入快照文件夹。快照文件夹是在启用复制时必须在分发服务器上设置的共享文件夹位置。复制设置中的每一个参与者都须要访问快照文件夹。
每次运行快照复制时,一切都是从头开始,所以它具备高带宽和存储需求。默认状况下,全部其余类型的复制都使用一个复制快照,仅在初始设置期间将全部订阅服务器与分发服务器同步。
事务性复制
事务性复制的工做方式,顾名思义,是基于事务的。每个提交的事务都会被扫描到用于复制文章的更改。对更改的扫描是经过日志读取器代理完成的,该代理读取发布服务器数据库的事务日志。若是有更改影响已发布的对象,则这些更改将登陆到分发数据库的分发服务器。他们从那里开始向订户们前进。
事务性复制容许接近实时同步,而且只给发布者留下很小的足迹。虽然有几种容许双向数据移动的选项,但事务性复制最初只是设计为单向的。
合并复制
合并复制是从一开始就设计的,容许对发布服务器和订阅方的数据进行更改。合并复制还容许断开链接的场景,其中用户可能在白天不链接。该订户将在晚上从新链接后进行同步。若是一行在两个不一样的地方同时更新,就会发生冲突。合并复制附带了几个用于解决这些冲突的选项。
设置事务复制
本节将逐步指导如何设置包含单个复制表的事务复制。
要设置复制,须要配置分发服务器、发布者和订阅者。可使用t - sql脚本彻底地设置和控制复制。可是,必要的t - sql涉及到使用存储过程,这些存储过程总共有超过100个必需的参数。所以,使用ssms - gui开始是有意义的。这里显示的示例屏幕截图是在一个服务器上(WIN2008A)上安装的,上面安装了一个sql - server实例(R2A)。这个实例是一个sql - server 2008R2实例。可是,您也能够参考SQL Server 2008和2005的示例。
创建分布
分发服务器是事务性复制的核心。在设置全部其余组件时,须要提供它,所以须要首先配置它。
从打开SSMS开始,链接到包含复制源数据的sql - server实例。虽然分发服务器能够在本身的sql - server实例上,但在许多状况下,让发布者和分发服务器都生活在同一台机器上是有意义的,正如本例中所假定的那样。
链接到服务器后,右键单击服务器下的“复制”文件夹并选择“配置分发…”如图1所示。
配置分布向导将以其启动屏幕向您表示欢迎,如图2所示。
忽略此屏幕并单击“Next”是安全的。
在下一个屏幕(图3)中,您将选择分发服务是否应该在该服务器上运行,或者您的网络中是否已经有一个已配置的分发服务器。分发服务运行的机器也将包含分发数据库。在缺省状况下保留此选择,即在此服务器上安装分发版并单击“Next”。
这将打开图4中的对话框,要求您选择快照文件夹的位置。
快照文件夹能够是您的机器上的任何位置,也能够是您的网络中的任何位置。为它建立一个网络共享是有意义的。这个示例使用“\ \ WIN2008A \ ReplicationSnapshotFolder”。
快照文件夹的设置要求授予适当的权限。如今,不要过多地讨论细节,授予对“已验证用户”(图5)的访问权限,并读取“每一个人”的访问权限(图6)。有关如何增强这一地区的安全的更多信息将在这个楼梯的稍后一层给出。
图6:容许访问快照文件夹共享
设置好共享并将网络路径放入向导的输入字段后,按下“Next”,进入图7所示的“分发数据库”表单。
这里指定了分布数据库的名称,以及它的数据和日志文件的位置。保留默认值,而后单击“Next”,以进入“发布者”屏幕(图8)。
在“发布者”屏幕上,您可让潜在的发布者可以使用该分发器。咱们将在同一个实例上安装咱们的发布者,所以您能够将默认值和“Next”保留到最后一个问题(图9)。
图9:向导操做
最后一个问题是,您是否但愿向导当即执行您的选择,或者您但愿向导建立脚本,您将在稍后的时间手动执行该脚本。再次,保留默认设置,最后一次单击“Next”。
如今您将看到一个操做列表,如图10所示。点击“Finish”开始这个过程。
图10:向导总结
最后,图11中显示的屏幕提供了关于复制配置的进展和成功的信息。
图11:执行状态
第一次出版
要建立发布,首先须要有一个包含要发布的表的数据库。执行SQL脚本1,为发布建立一个测试数据库。
USE MASTER; GO EXECUTE AS LOGIN = 'SA'; GO CREATE DATABASE ReplA; GO USE ReplA; GO IF OBJECT_ID('dbo.Test') IS NOT NULL DROP TABLE dbo.Test; GO CREATE TABLE dbo.Test( Id INT IDENTITY(1,1) PRIMARY KEY, Data INT CONSTRAINT Test_Data_Dflt DEFAULT CHECKSUM(NEWID()) ); GO INSERT INTO dbo.Test DEFAULT VALUES; GO 1000 USE MASTER; GO REVERT; GO
脚本1:为发布建立一个测试数据库
如今,您已经准备好设置一个发布了。
在SSMS对象资源管理器中打开复制文件夹并右键单击“本地发布”。选择“新出版…在下拉菜单中(图12)。
图12:新的出版物
“新发布向导”的欢迎页面如图13所示。
图13:配置发布向导
单击“下一步”。
在“发布数据库”框中(图14)选择您刚刚建立的数据库ReplA并单击“Next”。“发布类型”屏幕(图15)容许您选择要使用的复制类型。选择“事务性发布”并单击“Next”。
图14:选择发布数据库
图15:出版类型
如今您能够选择该发布的哪篇文章(图16)。选择表dbo。测试并再次点击“Next”,以移动到“过滤器表行”对话框(图17)。过滤器是一个高级的主题,它将在后面的楼梯中被覆盖,因此如今只需点击“Next”,而不须要在这个表单上作出选择.
图16:文章
图17:行过滤器
接下来的三个屏幕处理快照代理。在第一个屏幕上(图18)选择“当即建立一个快照”并单击“Next”。在“代理安全”屏幕上(图19)单击“安全设置”按钮,并在打开的表单上选择“在sqlserver代理服务账户下运行”(图20)。
图18:快照时间表
图19:代理安全性
图20:选择一个账户
在表单上单击“肯定”,而后在代理安全屏幕上单击“下一步”。
这就引出了“向导操做”表单(图21),供您选择“建立发布”。最后一次点击“Next”会将您带到摘要屏幕(图22)。
图21:向导操做
图22:向导总结
在这里,您须要为发布选择一个名称。在字段中键入“MyFirstPublication”,而后单击“Finish”启动进程。一样,最后一个屏幕(图23)显示了进程结束时的进度信息和成功状态。
图23:执行状态
第一次订购
在大多数状况下,订阅服务器将位于不一样的机器上,可是您但愿它位于同一实例上的场景。为了保持这个示例的简单性,咱们将继续使用相同的实例。使用脚本2中的代码:建立数据库ReplB。
USE MASTER; GO EXECUTE AS LOGIN = 'SA'; GO CREATE DATABASE ReplB; GO REVERT; GO
脚本2:建立目标数据库
如今咱们访问SSMS对象资源管理器,右键单击“本地订阅”并选择“新订阅……”在下拉菜单中(图24)
图24:选择新订阅
“新订阅向导”(图25)欢迎您,并为您提供另外一个练习按下“Next”按钮的机会。
图25:新的订阅向导
在“发布”表单中(图26)选择您刚刚建立的发布,并单击“Next”。“分布代理位置”屏幕(图27)容许您在push和pull订阅之间进行选择。保留默认值并移动到“订阅者”屏幕(图28)。
图26:选择发布
图27:推或拉
图28:目标数据库
在这里,您须要选择您的服务器并选择ReplB数据库。
下一个屏幕容许您设置“分发代理安全性”(图29)
图29:分发代理安全性
单击右侧的小省略号按钮,并在打开的表单中选择“运行在sqlserver代理服务账户下”(图30)。
图30:选择一个账户
点击“OK”,而后“Next”将您带到“同步计划”屏幕(图31)。选择“连续运行”并转移到“初始化订阅”屏幕(图32)。保留默认值,当即初始化,而后“下一步”到“向导操做”表单(图33)。
图31:同步时间表
图32:初始化
图33:向导操做
如前所述,保留默认值(建立订阅)并单击“Next”,您将看到一个即将执行的操做列表(图34)。单击“Finish”启动进程,等待绿色成功标志出如今最终表单上(图35)。
图34:向导总结
图35:执行状态
Script1建立了表dbo。在ReplA中测试并插入1000行。在初始快照转移到订阅服务器以后,您将找到dbo。测试表也在ReplB中包含了全部1000行。完成设置后的几分钟,您能够运行脚本3来验证复制是否按预期将全部数据推送到订阅服务器。此脚本与ReplA.dbo链接。测试和ReplB.dbo。测试表一块儿显示哪些行被正确复制。您如今能够运行本身的进一步测试,您能够在ReplA.dbo中插入和更新行。测试和观察这些变化会神奇地出如今replb . dbo中。测试。
SELECT TOP(20) A.Id AS [ReplA.Id],A.Data AS [ReplA.Data],B.Id AS [ReplB.Id],B.Data AS [ReplB.Data] FROM ReplA.dbo.Test A FULL OUTER JOIN ReplB.dbo.Test B ON A.Id = B.Id ORDER BY A.Id DESC
脚本3:比较发布者和订阅者
在SQL服务器实例中,被标记为复制的发布者的数据库中的对象称为文章。文章被分组到出版物中。订阅方经过订阅对文章的更改进行更新。数据流经分布在分发服务器上的数据库。发布者、分发服务器和订阅者能够是同一个实例,也能够是在相同或不一样机器上的独立实例。源数据库和目标数据库能够是相同的(若是发布者和订阅者其实是相同的SQL Server实例),可是分发数据库必须是独立的。
原文地址:http://www.sqlservercentral.com/articles/Stairway+Series/72274/