塞巴斯蒂安·梅内,2012/12/26
该系列 本文是“Stairway系列:SQL Server复制的阶梯”的一部分 SQL复制可以解决运行数据库驱动的应用程序中的许多问题。出版/订阅者模型并不完全容易理解,脚本和监控复制系统的复杂性需要考虑。在这里,最后是一系列文章,注意为所有类型的SQL Server复制生成一个无行话的方法。 级别1:SQL Server复制简介 主要条目:rep-li-ca-tion 发音:\?re-pl? - ‘ka-sh?n \ 功能:名词 日期:14世纪 复制这个词来自拉丁词replicare意思是重复。复制描述了复制或复制的过程(www.merriam-webster.com)。 SQL Server中的复制完全是这样的;它复制或复制数据。无论何时您需要创建数据的副本,或者重现对该数据的更改,都可以使用复制。该副本可以在同一个数据库中创建,也可以在单独的服务器上的远程位置创建。 副本可以连续保持与源数据同步,或按照预定的时间间隔同步。单向同步以及双向同步是可能的。复制甚至可以用来保持几个数据集相互同步。 在第一个层面,我将介绍基本复制组件,并描述它们如何协同工作,以便复制数据和更改数据。我们还将看一个设置简单复制场景的详细示例。 复制组件 SQL Server复制由三个组件组成:发布者,分发者和订阅者。这些组件对发布和订阅中定义的文章起作用。 文章 对于每个应该复制的SQL Server对象,需要定义一个复制项目。每篇文章对应于单个SQL Server对象或对象的子集。最经常复制的对象是表,视图和存储过程。有关可以复制的对象的完整列表,请参阅联机丛书中的发布数据和数据库对象。文章的属性确定文章是否包含整个对象,或者是否已过滤的对象子集构成复制文章。有了一些限制,可以在一个对象上创建多篇文章。 出版物 逻辑上属于一组的文章可以合并成一个出版物。该出版物定义了适用于该出版物中所有文章的选项。发布定义的主要选项是要使用的复制的类型。 出版者 使发布可用于复制的SQL Server实例称为发布者。 发布者监视所有文章的更改,并提供有关分发者可用更改的信息。 分销商 分销商是SQL Server实例跟踪所有订户和所有发布的更改,并确保每个订户得到每个更改的通知。大部分更改都在分配数据库中进行跟踪。分发者可以是单独的SQL Server实例,但分发服务通常与发布者在同一台计算机上运行。 订户 订户是通过订阅接收所有已发布信息的SQL Server实例。 订阅 订阅是该出版物的副本。订阅定义哪个服务器(订户)将接收发布中发布的更新。每个订阅都会在一个发布和一个订阅者之间建立链接。有两种类型的订阅:推送订阅和请求订阅。在推送订阅中,分发者直接更新订户数据库中的数据。在订阅订阅中,订阅者定期询问分发者是否有新的更改可用,然后更新数据本身。
复制类型 在SQL Server中有三种主要的复制类型。它们是快照复制,合并复制和事务复制。 快照复制 快照复制会在每次运行时创建复制对象及其数据的完整副本。它使用SQL Server的BCP实用程序将每个表的内容写入快照文件夹。快照文件夹是启用复制时必须在分发服务器上设置的共享文件夹位置。复制设置中的每个参与者都需要访问快照文件夹。 每次运行快照复制时,都会从头开始复制,因此具有较高的带宽和存储要求。所有其他类型的复制(默认情况下)都使用一个复制快照,仅在初始设置期间将所有订户与分销商同步。 事务复制 事务性复制如其名称所暗示的那样在事务基础上起作用。扫描每个提交的事务以查找应用于复制文章的更改。扫描更改由日志读取器代理完成,该日志读取器代理读取发布者数据库的事务日志。如果影响已发布对象的更改发生了,那么这些更改将记录在分发数据库中的分发服务器上。从那里他们向订户进发。 事务复制允许接近实时同步,并且在发布者上只留下很小的空间。虽然有几个选项可以允许双向数据移动,事务复制最初只设计为单向工作。 合并复制 合并复制的设计从一开始就允许在发布者和订阅者端对数据进行更改。合并复制还允许在白天不连接用户的情况下断开连接。该用户将在晚上重新连接后同步。如果一行在两个不同的地方同时更新,则会发生冲突。合并复制带有几个内置的选项来解决这些冲突。 设置事务复制 本节是分步指南,介绍如何设置涉及单个复制表的事务复制。 要设置复制,需要配置分发者,发布者和订阅者。可以使用T-SQL脚本完全设置和控制复制。但是,必要的T-SQL涉及使用存储过程,这些存储过程一起具有超过一百个所需的参数。所以通过使用SSMS-GUI开始是有意义的。这里显示的示例屏幕截图是在安装了SQL Server实例(R2A)的单台服务器(WIN2008A)上进行的。这个实例是一个SQL-Server 2008R2实例。但是,您也可以按照SQL Server 2008和2005上的示例进行操作。 建立分配 分销商是事务复制的核心。设置所有其他组件时需要可用,因此需要先配置。 通过打开SSMS并连接到将包含您的复制源数据的SQL-Server实例开始。虽然分销商可以在自己的SQL服务器实例上,但在许多情况下,让发布商和分销商位于同一台计算机上是有意义的,正如本例中所假设的那样。 连接到服务器后,右键单击服务器下的“复制”文件夹,然后选择“配置分发...”,如图1所示。
Configure Distribution Wizard(配置分发向导)将以其启动屏幕迎接您,如图2所示。
忽略此屏幕并单击“下一步”是安全的。 在下一个屏幕上(图3),您将选择是否在此服务器上运行分发服务,或者您的网络中是否已经有配置的分发服务器。 运行分发服务的机器还将包含分发数据库。 将此选项保留为默认值,即在此服务器上安装发行版,然后单击“下一步”。
图3:选择分发服务器
这将弹出图4中的对话框,要求您选择快照文件夹的位置。
快照文件夹可以是机器上或网络中的任何位置。 在分销商上创建网络共享是有意义的。 本示例使用“\\ WIN2008A \ ReplicationSnapshotFolder”。 快照文件夹的设置也需要授予适当的权限。 现在不要进入太多的细节,授予对文件夹本身的“Authenticated Users”(图5)的写访问权限,并读取共享上“Everyone”(图6)的访问权限。 关于如何加强这个领域的安全的更多信息将在这个阶梯的后续阶段给出。
图5:授予对快照文件夹的访问权限
图6:授予对快照文件夹共享的访问权限
在您设置您的共享并将网络路径放入向导的输入字段后,按“下一步”转到图7所示的“分发数据库”表单。
图7:分发数据库
在这里指定分发数据库的名称以及数据和日志文件的位置。 保留默认值,然后点击“下一步”进入“发布者”屏幕(图8)。 在“发布者”屏幕上,您准备潜在的发布者能够使用此分发者。 我们将在同一个实例上安装我们的发布服务器,因此您可以将默认值和“Next”保留在最终的问题中(图9)。
最后一个问题是,您是希望向导立即执行您的选择还是希望向导创建将在稍后手动执行的脚本。 同样,保持默认设置,最后一次点击“下一步”。 现在您将看到如图10所示的操作列表。 点击“完成”开始该过程。
图10:向导摘要
最后,图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:新出版物
出现“新建发布向导”的欢迎页面,如图13所示。
在“发布数据库”框中(图14),选择刚创建的数据库ReplA,然后单击“下一步”。 “发布类型”屏幕(图15)允许您选择要使用哪种类型的复制。 选择“事务性发布”,然后点击“下一步”。
现在您可以选择哪些文章应该成为本文的一部分(图16)。 选择表dbo.Test并再次点击“Next”进入“Filter Table Rows”对话框(图17)。 过滤器是一个高级的话题,将在这个阶梯的后面的层次中介绍,所以现在只需点击“下一步”,而不需要在这个表单上做出选择。
接下来的三个屏幕处理快照代理。 在第一个屏幕上(图18),选择“立即创建快照”,然后点击“下一步”。 在“代理安全”屏幕上(图19),单击“安全设置”按钮,然后在打开的表单上选择“在SQL Server代理服务帐户下运行”(图20)。
Script1在ReplA中创建了表dbo.Test,并在其中插入了1000行。 在初始快照传输给订阅者后,您将在ReplB中找到dbo.Test表,其中包含所有1000行。 在完成设置后的几分钟内,您可以运行“脚本3”以验证复制是否按预期将所有数据推送到订户。 此脚本将ReplA.dbo.Test和ReplB.dbo.Test表连接在一起,以显示正确复制了哪些行。 你现在可以运行你自己的进一步的测试,你可以插入和更新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
脚本3:比较发布者和订阅者 概要 SQL Server实例上被称为发布服务器的数据库中标记为要复制的对象称为文章。 文章被分组在一起成为出版物。 订阅者通过订阅获得对文章发生的更改的更新。 数据流经分销商的分销数据库。 发布者,分发者和订阅者可以是相同的实例,也可以是相同的或不同的计算机上的独立实例。 源和目标数据库可以是相同的(如果发布者和订阅者实际上是相同的SQL Server实例),但分发数据库必须是分开的。