本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文。
复制这个词来自拉丁语中的"replicare",意味着重复。Replication describes the process of reproducing or duplicating.
Replication in SQL Server does exactly that;it reproduces or duplicates data.任何时候,你需要创建一个数据的副本,或重现该数据的变化,复制可以使用。副本可以在同一个数据库中创建,或者在一台不同的服务器上的远程位置创建。
副本可以连续不断地与源数据保持同步,或在预定的时间间隔内进行同步。复制可以是单向同步或双向同步。Replication can even be used to keep several datasets in sync with each other.
在第一篇,我会告诉你基本的复制组件,并描述他们如何工作,让你复制你的数据和数据的变化。我们还将详细介绍建立一个简单的复制示例。
复制组件
SQL Server复制包含三大组件:发布服务器、分发服务器和订阅服务器。这些组件作用于发布和订阅所定义的文章。
文章
For each SQL Server object that should be replicated, a replication article needs to be defined.每一个文章对应一个SQL Server对象,或一个对象的子集。经常用于复制的对象有表、视图和存储过程。如果需要复制对象的完整列表,可以在Books Online中查找。文章的属性决定了该文章是否包含整个对象,或者只是对象的子集。由于这些限制,可以在单个对象上创建多个文章。
发布
逻辑上属于一组的文章可以组合成一个发布。The publication has options defined that apply to all the articles in that publication.发布的一个主要选项是选择要使用的复制类型。
发布服务器
复制中让发布可用的数据库实例就是发布服务器。发布服务器监控所有文章的变更,并让所有变更信息可用于分发服务器。
分发服务器
分发服务器是用于跟踪所有订阅服务器和所有发布变更的数据库实例,确保每个订阅服务器得到每个变更的通知。大多数的变更被跟踪到一个分发数据库。分发服务器可以是一个单独的SQL Server实例,但往往分布服务运行在发布服务器上。
订阅服务器
通过订阅接收所有发布信息的数据库实例。
订阅
订阅是发布的对应内容。订阅定义哪个服务器(订阅服务器)将接收在发布中的更新。每一个订阅在一个发布和一个订阅服务器之间创建一个链接。订阅有两种类型:推送订阅和请求订阅。在推送订阅中,分发服务器直接更新订阅服务器数据库中的数据。在请求订阅中,订阅服务器定时请求分发服务器,如果出现任何新的更改,则自己更新数据。
复制类型
SQL Server中主要有三大复制类型:快照复制、合并复制和事务复制
快照复制
快照复制每次运行时会对复制的对象和数据创建一个完整的副本。它使用SQL Server‘s BCP将每个表的内容写到快照文件夹。快照文件夹是在配置分发时创建的一个共享文件夹。Each participant in a replication setup needs to have access to the snapshot folder.
每一次快照复制运行,一切都是从零开始重新复制,因此它具有很高的带宽和存储要求。所有其他类型的复制(默认情况下)只有在初始化设置时才使用一个复制快照,以同步所有订阅服务器。
事务复制
事务复制工作于事务的基础之上。Every committed transaction gets scanned for changes applied to replication articles.变更扫描是由日志读取代理完成,它读取发布数据库的事务日志。如果有更改影响已发布对象的话,这些更改将记录在分发服务器上的分发数据库。从那里,他们使用他们的方式应用到订阅服务器。
事务复制允许几乎实时同步,并在发布服务器中只留下一个小印记。虽然有几个选项,允许双向数据传递,事务复制最初是设计为单向同步的。
合并复制
合并复制的设计从一开始就允许对发布服务器以及订阅服务器的数据进行修改。合并复制还允许断开连接的情况/场景,订阅服务器在白天可能无法连接。那个订阅服务器可以在晚上重新连接上后同步。如果一行记录同一时间在两个不同地方被更新,合并复制有几个内置的选项来解决这类冲突。
配置事务复制
为了创建复制,需要配置分发服务器、发布服务器和订阅服务器。复制可以使用T-SQL脚本创建和控制。然后,相关的存储过程数量超过一百多个。因此我们还是使用SSMS图形界面来操作。下面的这个例子是在同一台服务器的同一个实例(SQL2008R2)下实现的。
配置分发
分发服务器是事务复制的核心。在配置其他组件时需要它可用,因此首先要配置分发服务器。
打开SSMS连接到包含复制的源数据库的实例。分发服务器可以在源数据库实例上,很多情况下发布服务器和分发服务器在同一台机器上,本例也是这样。
在你连接到实例后,右击复制文件夹,选择"配置分发…"如图1.1所示:
图1.1 配置分发
配置分发向导显示起始页
图1.2 配置分发向导
在下一个页面(图1.3)你要选择使用此服务器作为自己的分发服务器或选择其他服务器作为分发服务器。分发服务运行的机器还会包含有分发数据库。接受默认设置,也就是使用此服务器充当自己的分发服务器,然后点击下一步(补充:如果代理服务不是自动启动,下一步会提示是否将SQL Server代理服务配置为自动启动)。
图1.3 选择分发服务器
我们来到图1.4对话框,询问快照文件夹的存储位置
图1.4 快照文件夹
快照文件夹可以是你机器或网络的任何位置。在分发服务器上为它创建一个网络共享是有意义的。本例中使用"\\USER-67NP5R8LGK\repldata"
创建快照文件夹需要授予合适的权限。目前我们不会深入到细节,给"Authenticated Users"对文件夹有写的权限(图1.5),给"Everyone"对共享有读的权限(图1.6)。更多关于这一块的安全内容会在这一系列的后面提到。
图1.5 快照文件夹授权访问
图1.6 快照共享文件夹授权访问
在你设置好共享文件夹并将网络路径键入到向导输入框,点击下一步到分发数据库
图1.7 分发数据库
在这里你可以设置分发数据库的名称,以及它的数据文件与日志文件的存储位置。保留默认设置点击下一步来到发布服务器页面
图1.8 准备发布服务器
在发布服务器页面,你准备可能的发布服务器能够使用此分发服务器。我们将配置发布服务器在同一个实例上,因此保留默认设置点击下一步
图1.9 向导操作
最后一个问题是:在向导结束时配置分发还是生成包含配置分发的步骤的脚本文件。保留默认设置点击下一步。
现在你会看到如1.10所示的将会执行的一系列操作。点击完成开启进程
图1.10 向导总结
最后,显示如图1.11所示的配置成功信息
图1.11 执行状态
新建发布
为了创建一个发布,我们首先需要有一个数据库包含一张表用于发布。执行代码1.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.1 创建发布所用的测试数据库
在SSMS对象资源管理器,打开复制文件夹,右击"本地发布",选择"新建发布"(图1.12)
图1.12 新建发布
出现图1.13所示的新建发布向导欢迎页
图1.13 新建发布向导
点击下一步,在发布数据库(图1.14)中选择刚才创建的ReplA然后点击下一步。发布类型(图1.15)选择事务复制然后点击下一步
图1.14 选择发布数据库
图1.15 发布类型
现在你可以选择这个发布的文章(图1.16)。勾选dbo.Test表然后点击下一步来到筛选表行对话框(图1.17)。筛选是一个高级主题将会在后面章节讲述,因此现在不需要做任何选择只需点击下一步
图1.16 文章(项目)
图1.17 行筛选
接下来的三个页面是处理快照代理的。第一页面(图1.18)选择"立即创建快照"然后点击下一步。在代理安全性页面(图1.19)点击安全设置按钮,然后选择"在SQL Server代理服务帐户下运行"(图1.20)
图1.18 快照计划
图1.19 代理安全性
图1.20 选择帐户
点击确定然后在代理安全性页面点击下一步。这会带到向导操作页面(图1.21)选择创建发布,点击下一步来到总结页面(图1.22)
图1.21 向导操作
图1.22 向导总结
这里你需要为发布设定一个名称。键入"MyFirstPublication",然后点击完成。最后,显示如图1.23所示的配置成功信息。
图1.23 执行状态
新建订阅
大多数情况下,订阅服务器与发布服务器是不同的机器,但是也有你想让它们在相同的实例的场景。为了让这个例子简单我们使用相同的实例。使用代码1.2创建ReplB数据库
USE MASTER; GO EXECUTE AS LOGIN = ‘SA‘; GO CREATE DATABASE ReplB; GO REVERT; GO
代码1.2 创建目标数据库
在SSMS对象资源管理器,打开复制文件夹,右击"本地订阅",选择"新建订阅"(图1.24)
图1.24 选择新建订阅
出现图1.25所示的新建订阅向导欢迎页,点击下一步
图1.25 新建订阅向导
在发布页面(图1.26)选择刚创建的发布,点击下一步。"分发代理位置"(图1.27)让你选择推送订阅还是请求订阅。保留默认设置到订阅服务器页面(图1.28)
图1.26 选择发布
图1.27 推送/请求订阅
图1.28 订阅服务器
这里你需要选择订阅服务器和订阅数据库。
下一个页面设置"分发代理安全性"(图1.29)
图1.29 分发代理安全性
点击右侧的省略号按钮,选择"在SQL Server代理服务帐户下运行"(图1.30)
图1.30 选择帐户
点击确定,然后下一步到同步计划(图1.31)。代理计划选择连续运行。下一步到初始化订阅(图1.32)。保留默认设置,立即初始化,点击下一步到向导操作(图1.33)
图1.31 同步计划
图1.32 初始化
图1.33 向导操作
和之前一样,保留默认设置(创建订阅)然后点击下一步来到总结页面(图1.34)——将会执行的系列操作。点击完成启动进程,然后等待绿色成功标记出现(图1.35)
图1.34 向导总结
图1.35 执行状态
代码1.1在数据库ReplA下创建表dbo.Test,并插入1000行记录。在初始化快照传送到订阅服务器后,你将会看到在数据库ReplB下同样有表dbo.Test,并且有1000行记录。在你配置完成后你可以执行代码1.3来验证复制把所有的数据推送到订阅服务器。你可以自己运行其他测试脚本,你可以插入、更新ReplA.dbo.Test然后观察ReplB.dbo.Test也出现同样的变更。
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
代码1.3 比较发布与订阅
总结
Objects in a database on a SQL Server instance referred to as the publisher that are marked for replication are called articles.Articles are grouped together into publications. 订阅服务器通过订阅获取发生在文章上的更新。数据流经分发服务器上的分发数据库。发布服务器、分发服务器和订阅服务器可以是同一个实例或相同/不同的机器上的单独的实例。源和目标数据库可以是相同的(如果发布服务器和订阅服务器是相同的SQL Server实例),但分发数据库必须是分开的。