单词replication来自拉丁语单词replicare,意思是重复。复制描述复制或复制的过程(www.merriam-webster.com)。 SQL Server中的复制就是这样做的;它复制或复制数据。任何时候需要创建数据的副本,或复制对数据的更改时,都可以使用复制。该副本可以在相同的数据库中创建,也可以在单独服务器的远程位置创建。 副本可以连续地与源数据保持同步,或者按预定的时间间隔同步。单向同步和双向同步是可能的。复制甚至可以用来保持多个数据集彼此同步。 在第一个级别中,我将介绍基本复制组件,并描述它们如何协同工作以允许您复制数据和数据更改。我们还将查看设置简单复制场景的详细示例. 复制组件
SQL Server复制由三个组件组成:发布服务器、分发服务器和订阅服务器。这些组件作用于在发布和订阅中定义的文章. 文章
对于应该复制的每个SQL Server对象,都需要定义一个复制条目。每一篇文章对应一个SQL Server对象,或者一个对象的子集。最常被复制的对象是表、视图和存储过程。要获得可复制对象的完整列表,请查看在线图书中的发布数据和数据库对象。文章的属性决定了文章是否包含整个对象,或者对象的筛选子集是否构成复制的文章。通过一些限制,可以在一个对象上创建多个文章。 出版
逻辑上属于一起的一组文章可以组合成一个出版物。发布中定义了适用于该发布中的所有文章的选项。发布定义的主要选项是要使用的复制类型。 出版商
使发布可用于复制的SQL Server实例称为发布程序。 发布者监视所有文章的更改,并将这些更改的信息提供给分发服务器. 经销商
分发服务器是SQL Server实例,它跟踪所有订阅者和所有已发布的更改,并确保每个订阅者在每次更改时都得到通知。大多数更改都是在分布数据库中跟踪的。分发服务器可以是一个单独的SQL Server实例,但是分发服务通常与发布服务器运行在同一台机器上。 订阅者
订阅者是通过订阅接收所有发布信息的SQL Server实例。 订阅
订阅是发布的对应项。订阅定义要接收发布中发布的更新的服务器(订阅服务器)。每个订阅在一个发布和一个订阅之间创建一个链接。订阅有两种类型:推订阅和拉订阅。在推送订阅中,分发服务器直接更新订阅服务器数据库中的数据。在pull订阅中,订阅者定期询问分发服务器是否有可用的新更改,然后更新数据本身。 复制类型
SQL Server中有三种主要的复制类型。它们是快照复制、合并复制和事务复制。 快照复制
快照复制在每次运行时创建复制对象及其数据的完整副本。它使用SQL Server的BCP实用程序将每个表的内容写入快照文件夹。快照文件夹是共享文件夹位置,在启用复制时必须在分发服务器上设置该位置。复制设置中的每个参与者都需要访问快照文件夹。 每次运行快照复制时,所有内容都是从零开始重写的,因此它具有高带宽和存储需求。默认情况下,所有其他类型的复制都使用一个复制快照,仅在初始设置期间将所有订阅者与分发服务器同步。 事务性复制
顾名思义,事务性复制是在事务的基础上工作的。每个提交的事务都被扫描,以查找应用于复制文章的更改。更改的扫描由日志读取器代理完成,该代理读取发布者数据库的事务日志。如果有影响已发布对象的更改,这些更改将被记录到分发数据库中的分发服务器上。从那里,他们走向订户。 事务复制允许接近实时同步,并且只在发布服务器上留下很小的内存占用。虽然有几个选项允许双向数据移动,但事务复制最初设计为只以一种方式工作。 合并复制
合并复制从一开始就设计为允许在发布服务器和订阅服务器端对数据进行更改。合并复制还允许断开连接的场景,其中订阅服务器可能在白天没有连接。该订阅者将在晚上重新连接后同步。如果一行同时在两个不同的位置得到更新,就会发生冲突。合并复制附带几个内置选项来解决这些冲突。 设置事务复制
本节将逐步介绍如何设置包含单个复制表的事务复制。 要设置复制,需要配置分发服务器、发布服务器和订阅服务器。可以使用T-SQL脚本完全设置和控制复制。然而,必要的T-SQL涉及到存储过程的使用,这些存储过程总共有超过100个必需的参数。因此,从使用sms - gui开始是有意义的。这里显示的示例截图是在单个服务器(WIN2008A)上完成的,服务器上安装了SQL-Server实例(R2A)。这个实例是SQL-Server 2008R2实例。不过,您也可以在SQL Server 2008和2005上使用这些示例。 建立分布
分发服务器是事务复制的核心。在设置所有其他组件时,需要使用它,因此需要首先配置它。 首先打开SSMS并连接到包含复制源数据的SQL-Server实例。虽然分发服务器可以位于它自己的SQL-server实例上,但是在许多情况下,让发布服务器和分发服务器位于同一台机器上是有意义的,本例中将假定这一点。 连接到服务器后,右键单击服务器下的“Replication”文件夹,并选择“Configure Distribution…”,如图1所示。 图1:配置分布
Configure Distribution向导将用它的启动屏幕向您问候,如图2所示。
图2:配置分发向导
忽略此屏幕并单击“Next”是安全的。 在下一个屏幕上(图3),您将选择是否应该在此服务器上运行分发服务,或者您的网络中是否已经配置了分发服务器。运行分发服务的机器也将包含分发数据库。将此选项保留为默认值,即在此服务器上安装distribution并单击“Next”。 图3:选择分发服务器
这将打开图4中的对话框,要求您选择快照文件夹的位置。 图4:快照文件夹
快照文件夹可以是计算机或网络中的任何位置。在分发服务器上为它创建网络共享是有意义的。本例使用“\WIN2008A\ReplicationSnapshotFolder”。 快照文件夹的设置还需要授予适当的权限。现在不需要太多细节,只需要授予对文件夹本身的“经过身份验证的用户”的写访问权(图5)和对共享的“Everyone”的读访问权(图6)。有关如何加强这一地区的安全的更多信息将在这个楼梯的后面一层给出。 图5:授予对快照文件夹的访问权 图6:授予对快照文件夹共享的访问权
设置好共享并将网络路径放入向导的输入字段后,按“Next”进入“Distribution Database”表单,如图7所示. 图7:分布数据库
这里指定分发数据库的名称,以及它的数据和日志文件的位置。保留默认值,然后单击“Next”进入“Publishers”屏幕(图8)。 在“发布者”屏幕上,您准备让潜在发布者能够使用此分发服务器。我们将在同一个实例上安装发布者,因此您可以将缺省值和“Next”保留到最后一个问题(图9)。 图8:准备发布程序。 图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对象资源管理器中打开复制文件夹并右键单击“本地发布”。在下拉菜单中选择“New Publication…”(图12)。 图12:新发布
“New Publication向导”的欢迎页面如图13所示。 图13:配置发布向导
单击“下一步”。 在“发布数据库”框中(图14)选择刚刚创建的数据库ReplA并单击“Next”。“发布类型”屏幕(图15)允许您选择要使用哪种复制类型。选择“事务性发布”,然后单击“下一步”。 图14:选择发布数据库 图15:发布类型
现在您可以选择哪些文章应该是这个发布的一部分(图16)。选择表dbo。测试并再次单击“Next”,进入“Filter Table Rows”对话框(图17)。过滤器是一个高级主题,将在这个楼梯的后面一层中讨论,所以现在只需要单击“Next”,而不需要在这个表单上进行选择。 图16:文章 图17:行过滤器
接下来的三个屏幕处理快照代理。在第一个屏幕上(图18)选择“立即创建快照”并单击“Next”。在“代理安全性”屏幕上(图19),单击打开的表单上的“安全性设置”按钮,选择“在SQL Server代理服务帐户下运行”(图20)。 图18:快照时间表 图19:代理安全性 图20:选择一个帐户
单击表单上的“OK”,然后在代理安全屏幕上单击“Next”。 这将打开“向导操作”表单(图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对象资源管理器,右键单击“Local Subscriptions”,并在下拉菜单中选择“New Subscriptions…”(图24)。 图24:选择New Subscription
“New Subscription向导”(图25)欢迎您,并为您提供了另一个练习按“Next”按钮的机会。 图25:New Subscription向导
在“发布”表单中(图26)选择刚刚创建的发布,然后单击“Next”。“分发代理位置”屏幕(图27)允许您在推和拉订阅之间进行选择。保留默认值,然后转到“subscriber”屏幕(图28)。 图26:选择发布 图27:推或拉 图28:目标数据库
这里需要选择服务器并选择ReplB数据库。 下一个屏幕允许您设置“分发代理安全性”(图29)。 图29:分发代理安全性
单击右侧的小省略号按钮,并在打开的表单中选择“Run under the SQL Server Agent service account”(图30)。 图30:选择一个帐户
单击“OK”,然后单击“Next”将进入“同步计划”屏幕(图31)。选择“Run continuous”,然后转到“Initialize Subscriptions”屏幕(图32)。保留默认值,立即初始化,然后“Next”到“向导操作”表单(图33) 图31:同步计划 图32:初始化 图33:向导操作
与前面一样,保留缺省值(创建订阅)并单击“Next”,就会进入summary屏幕(图34),其中显示了将要执行的操作列表。单击“Finish”启动流程,等待绿色的success徽标出现在最终表单上(图35)。
图34:向导摘要 图35:执行状态 成功!
Script1创建了表dbo。在ReplA中进行测试,并将1000行插入其中。在将初始快照传输到订阅服务器后,您将找到dbo。测试表也在ReplB中,其中包含所有1000行。在完成设置几分钟后,可以运行脚本3来验证复制是否按预期将所有数据推送到订阅服务器。这个脚本加入reply .dbo。测试和ReplB.dbo。将测试表放在一起,以显示正确复制了哪些行。现在,您可以运行自己的进一步测试,可以在reply .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 Server实例上的数据库中的对象(称为标记为复制的发布者)称为articles。文章被分组成出版物。订阅服务器将通过订阅更新文章所发生的更改。数据流经分布服务器上的分布数据库。发布者、分发服务器和订阅者可以是同一机器上的同一个实例,也可以是不同机器上的独立实例。源数据库和目标数据库可以是相同的(如果发布者和订阅者实际上是相同的SQL Server实例),但是分发数据库必须是独立的.