介绍:
在运行着的数据库驱动的应用程序中,SQL复制能解决许多问题。由于发送/订阅的模式不是十分容易理解,复杂的脚本语言和监视复制系统也是需要一定的思想在里面。希望在接下来的几个章节中能尽量将基本原理和操作阐述的详细完整些,便于大家理解。
在SQLServer中,复制就是产生或复制数据;比如你需要去创建一个你数据的副本,或者复制一个那份数据的改变,SQL复制就派上用场了。
复制的副本可以在同一个数据库中也可以在远程的分隔的服务器上。
副本与源数据保持实时同步,或者在规定时间间隔内保持同步。单步同步方式,就像双向同步一样都是可行的,复制甚至能被用来保持多个数据集之间彼此的同步。既然有这么多优点,那我们就迫不及待的开始学习复制吧,当然一开始先要描述一些基础信息,比如基本的复制组件和这些组件如何组合在一起来实现复制。Come on!
复制的组成:
SQL Server 复制主要由三部分组成:出版商,经销商和订阅者,这些组件作用于发行和订阅服务器内部的文章上。
通过命名我们就能推想出来,复制很像报纸杂志的发行,可以简单理解它的一般流程:出版--》经销--》订阅。
文章(复制的对象)
对于每个应该被复制的对象,一个复制文章需要被定义。每个文章对应着一个见得SQLServer对象或者一个对象的子集。这个被复制的对象通常就是表、视图、或者存储过程。当然也可以在单个文章中创建多个对象。
出版物(对象的集合)
一组在逻辑上在一起的文章(复制的对象)被混合成一个出版物。这个出版物有公共的被定义的可选项,主要的选项就是复制的类型。
出版商(发布服务器)
一个提供复制的出版物的SQL Server 实例被叫做出版商。出版商监视所有改变的文章,并且将这些改变通知给经销商。
经销商(分发服务器)
经销商是既要追踪所有的订阅者又追踪所有的发布者的改变,同时要保证任何一个改变都会被每一个订阅者知晓。绝大多数的改变在分发服务器中被追踪到。尽管经销商能作为一个独立的数据库实例,但是通常情况下分发服务器会运行在出版商的机器上。
订阅者(订阅服务器)
订阅者可以看做是能够通过订阅的方式接收发布的所有信息的数据库实例。
订阅
订阅是相对于发布而言的,订阅定义了哪一个订阅服务器将要去接收来自发布服务器发布的更新。每个订阅创建了一个在发布者和订阅者之间的链接。有两种订阅方式,推送订阅(Push)和请求订阅(Pull)。
在推送订阅的情况下,分发服务器直接在订阅服务器数据库更新订阅的数据;
而在请求订阅的模式下,需要订阅服务器定期查询分发服务器是否有可用更新,如果存在任何的可用更新,那么订阅服务器自己完成更新数据。
复制的类型
在SQLServer 中主要有三种可用的复制类型,它们分别是:快照复制、合并复制和事物复制。
快照复制
快照复制就是每次运行都创建一个完整复制对象和对象数据的副本。它使用数据库的BCP 工具来写入每个表的内容到快照文件夹中。快照文件夹是一个共享的文件夹地址,在启动复制的时候这个地址必须被建立在分发服务器上。并且每个参与者都是有权限访问快照复制的文件夹的,需要在设置复制的时候进行设置。
这种模式缺点是:每次快照复制运行,都要所有的一切从头再来一遍,因此它会占用很高的带宽和存储。
需要了解的是,所有其他类型的复制在初始化设置的时候都要使用一个简单的复制快照来同步给所有的订阅者和经销商一个复制。
事务复制
顾名思义,就是以事务为基础。对于每一次提交的事务的变更都要被扫描到复制的文章中。事务日志读取代理扫描这些被做的变更,它读取发布数据库的事务日志。假如有改变影响了发布的对象,那么这些改变将被日志记录在分发数据库,然后分发数据库再选用合适的方式发送给订阅者。
事务复制可用作接近实时的同步,同时仅仅留下一些痕迹在发布方。尽管有一些选择项可以考虑使用双向数据移动,但是事务复制一开始就被设计为单向的模式。
合并复制
合并复制即允许发布服务器更新数据库,也允许订阅服务器更新数据。定期将这些更新进行合并,使得发布的数据在所有的节点上保持一致。因此,有可能发布服务器和订阅服务器更新了同样的数据,当冲突产生时,并不是完全按照发布服务器优先来处理冲突,而是根据设置进行处理,这些会在后续文章中讲到。
设置事务复制
这部分是一个一步一步的关于如何配置事务复制包括单边复制的指导。为了配置复制,分发者、发布者以及订阅者都需要被配置。复制可以通过使用T-SQL脚本来完整的配置和控制。但是会使用唱过太多繁琐的参数,因此我们将通过使用SSMS 来配置。这里我们使用了SQLServer2008 R2 版。
配置分发
分发环节是事务复制的核心。它是其他所有组件的先决条件,因此它需要首先配置。
进入SSMS,然后在左侧菜单栏右键点击"Replication"文件夹,选择配置分配,如图1:
图 1
配置分配的向导
图 2: 配置向导
向其他软件一样,NEXT即可。接下来你想要去选择是否在本服务器上运行分发服务还是你已经在网络上有一个配置好的分发服务器。这里我们选择默认的在本服务起上安装分发服务,然后点击"Next"。如图3
图 3
接下来就是对话框,要求你选择快照文件夹的路径。如图4
图4
快照文件夹可以被放置在你的机器上或者网络上。当然,在分发服务器上创建一个网络共享是很有价值的。这里的例子就是使用了这个\WIN2008AReplicationSnapshotFolder 地址。
快照文件夹的设置也需要适当的权限去授权。这里没必要太多去研究细节,我们授予写权限给"Authenticated Users" (图 5)在这个文件夹上,读权限授予"Everyone" (图6)共享。
图 5
图6
在你共享并且将网络地址输入到向导的输入地址后,点击“下一步”前往你分发数据库的窗口 。如图7:
图 7
你需要制定分发数据的名字和数据及日志的放置位置。其他的默认选项就好,点击"Next"进一步来到发布者窗口(图8)
在发布环节需要准备好潜在的发布者来使用分发者。我们来安装发布的在相同的实例上,在这里除了默认选项直接店家下一步到最后一个环节(图9)
图 8:准备发布者
图 9
最终的问题就是你是否要去立即执行的你的选项还是你想去创建脚本在一段时间以后在执行?再一次默认配置,最后一次点击下一步。现在你就能看到一个任务列表在图10 中。点击 "Finish" 开启这个进程
图 10:
最终,这个屏幕将展示如图11.给出关于进度和复制配置成功的信息。
图11
第一次发布
来创建一个发布,我们需要首先有个包含表的数据来发布。执行下面脚本中的代码来创建一个测试数据库
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
Script 1:创建测试数据库及表
现在准备好设置发布。
在SSMS对象浏览器中打开复制文件夹右键单击"Local Publication"。在下拉菜单中选择"New Publication..."
图12: New Publication
在图13中向导界面出现了
图 13: 配置发布向导
单击 "Next".
在发布数据库的选择框选择你刚刚创建的数据库,我这里是ReplA ,单击下一步,选择你要使用额度复制类型。选择事务复制,单击下一步在图15
图14:
图15: 选择复制类型
现在你将去选择哪个对象组作为发布的文章。图16.选择表dbo.Test 单击下一步,继续去过滤标的行在图17中。过滤部分的进阶内容在接下来的章节介绍。到目前为止只需要单击下一步不再做其他选择即可。
图16: 复制对象
图17: 行过滤
接下来三个环节就是处理快照代理图18,选择"Create a snapshot immediately" 然后点击下一步。在"Agent Security" 窗口(图19)点击"Security Settings" 按钮,然后选择"Run under the SQL Server Agent service account" 在图20中。
图18
图19
图 20: 选择账户
点击"OK"在表格中,然后选择"Next" 在代理安全窗口。接下来就是任务向导图21,选择"Create the publication"。单击下一步进入到最后的窗口图22
图21: 向导
图 22
在这你需要选择一个发布的名称。输入"MyFirstPublication"进入文本点击"Finish" 来开启这个进程。下面就是进度信息和状态图22
图 23
第一个订阅
在绝大多数情况下,订阅方在不同的机器上,但是为了保证实例简单我们将选择在同一个实例上配置订阅。使用Script 2: 创建数据ReplB
USE MASTER;
GO
EXECUTE AS LOGIN = 'SA';
GO
CREATE DATABASE ReplB;
GO
REVERT;
GO
Script 2: 创建目标数据库
现在我们进入SSMS对象浏览器右击"Local Subscriptions" 并选择"New Subscriptions..." 如图24
图 24
在订阅者向导欢迎界面,然后就是一路的下一步
图 25
在“Publication”窗口图26,选择我刚刚创建的发布,点击下一步。在"Distribution Agent Location" 的窗口选择push 或者pull 模式的订阅。其他默认前往订阅窗口图28。
图 26
图27: Push or Pull
图28: 目标数据库
这里你需要选择你的服务并选择ReplB 数据库,接下来下一个窗口设置"Distribution Agent Security" (图29).
图29: Distribution Agent Security
点击右侧小的省略符号按钮,然后选择"Run under the SQL Server Agent service account" 在新打开的窗口图30
Figure 30:
点击“OK” 然后点击下一步,去Synchronization Schedule" 窗口(图31),选择一个"Run continuously" 然后继续去"Initialize Subscriptions"窗口(图32).默认就行。然后立即初始化并且点击下一步去 "Wizard Actions" 窗口(图33)
图31: 同步步骤
图32: 初始化
图33: 执行向导
正如之前,其他的都是默认就好,点击下一步。到最后的窗体(图34),任务列表,点击完成 开始进程,然后等待绿色成功的标志出现在最后的页面(图35)。
图 34: 向导
图35: Status
成功
脚本1创建的dbo.Test 表在数据库ReplA ,并且插入了1000含数据。在初始化完成快照被转移到订阅者处,可以在这里也发现这个表也在ReplB ,也有1000行数据。在你完成配置之后你能运行Script 3 来验证这个复制推送所有数据给订阅者。连接两个表的脚本4来展示哪一个被复制了。能够进一步运行测试,也能插入和更新ReplA.dbo.Test 然后看看这些改变是否神奇的出现在ReplB.dbo.Test 里面了,哈哈
脚本3
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: 比较订阅者和发布者
总结
在数据库中的对象被称为发布者,就是在被标记为复制的发布者被叫做文章。文章就是组合在一起的复制。订阅者就是获取发生在文章中的更新通过订阅的方式。数据流通过存在于分发者的分发数据库分发。发布者,分发者和订阅者能是相同的实例,也可以是独立的实例在相同或者不同的机器上都可以。源和目的数据库能是相同的,但是分发的数据库必须是独立的。
本篇简答的介绍了复制相关的概念和简单的事务复制的配置和测试。接下来我们将进一步了解更复杂的复制等情况。