SQL Server 复制进阶:Level 1 - SQL Server 复制

塞巴斯蒂安·梅内,2012/12/26

关于系列

本文是属于Stairway系列:Stairway to SQL Server Replication

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所示。

\ 图1:配置分发

Configure Distribution Wizard(配置分发向导)将以其启动屏幕迎接您,如图2所示。

图2:配置分发向导

忽略此屏幕并单击“下一步”是安全的。

在下一个屏幕上(图3),您将选择是否在此服务器上运行分发服务,或者您的网络中是否已经有配置的分发服务器。 运行分发服务的机器还将包含分发数据库。 将此选项保留为默认值,即在此服务器上安装发行版,然后单击“下一步”。

图3:选择分发服务器

这将弹出图4中的对话框,要求您选择快照文件夹的位置。

图4:快照文件夹

快照文件夹可以是机器上或网络中的任何位置。 在分销商上创建网络共享是有意义的。 本示例使用“\ WIN2008A ReplicationSnapshotFolder”。 快照文件夹的设置也需要授予适当的权限。 现在不要进入太多的细节,授予对文件夹本身的“Authenticated Users”(图5)的写访问权限,并读取共享上“Everyone”(图6)的访问权限。 关于如何加强这个领域的安全的更多信息将在这个阶梯的后续阶段给出。

图5:授予对快照文件夹的访问权限

图6:授予对快照文件夹共享的访问权限

在您设置您的共享并将网络路径放入向导的输入字段后,按“下一步”转到图7所示的“分发数据库”表单。

图7:分发数据库

在这里指定分发数据库的名称以及数据和日志文件的位置。 保留默认值,然后点击“下一步”进入“发布者”屏幕(图8)。

在“发布者”屏幕上,您准备潜在的发布者能够使用此分发者。 我们将在同一个实例上安装我们的发布服务器,因此您可以将默认值和“Next”保留在最终的问题中(图9)。

图8:准备发布者

图9:向导操作

最后一个问题是,您是希望向导立即执行您的选择还是希望向导创建将在稍后手动执行的脚本。 同样,保持默认设置,最后一次点击“下一步”。

现在您将看到如图10所示的操作列表。 点击“完成”开始该过程。

图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:新出版物

出现“新建发布向导”的欢迎页面,如图13所示。

图13:配置发布向导

点击下一步”。

在“发布数据库”框中(图14),选择刚创建的数据库ReplA,然后单击“下一步”。 “发布类型”屏幕(图15)允许您选择要使用哪种类型的复制。 选择“事务性发布”,然后点击“下一步”。

图14:选择发布数据库

图15:发布类型

现在您可以选择哪些文章应该成为本文的一部分(图16)。 选择表dbo.Test并再次点击“Next”进入“Filter Table Rows”对话框(图17)。 过滤器是一个高级的话题,将在这个阶梯的后面的层次中介绍,所以现在只需点击“下一步”,而不需要在这个表单上做出选择。

图16:文章 图17:行筛选器

接下来的三个屏幕处理快照代理。 在第一个屏幕上(图18),选择“立即创建快照”,然后点击“下一步”。 在“代理安全”屏幕上(图19),单击“安全设置”按钮,然后在打开的表单上选择“在SQL Server代理服务帐户下运行”(图20)。

图18:快照计划

图19:代理安全

图20:选择一个帐户

单击表单上的“确定”,然后在代理安全性屏幕上单击“下一步”。

这会弹出“向导操作”窗体(图21),供您选择“创建出版物”。 最后一次单击“下一步”会显示摘要屏幕(图22)。

图21:向导操作

图22:向导摘要

在这里,您需要为您的出版物选择一个名称。 在该字段中键入“MyFirstPublication”,然后单击“完成”以启动该过程。 再次,最后的屏幕(图23)显示进程信息和过程完成时的成功状态。

图23:执行状态

第一次订阅

在大多数情况下,用户将在不同的机器上,但有一些情况下,您希望它在同一个实例上。 为了保持这个例子简单,我们将保持在同一个实例上。 使用脚本2中的代码:创建数据库ReplB。

USE MASTER;
GO
EXECUTE AS LOGIN = 'SA';
GO
CREATE DATABASE ReplB;
GO
REVERT;
GO

脚本2:创建目标数据库

我们现在进入SSMS对象浏览器,右键点击“本地订阅”,然后在下拉菜单中选择“新订阅...”(图24)。

图24:选择新的订阅

“新订阅向导”(图25)欢迎你,给你另一个练习按“下一步”按钮的机会。

图25:新的订阅向导

在“发布”表单(图26)中选择您刚刚创建的发布,然后单击“下一步”。 “分发代理位置”屏幕(图27)允许您在推送和订阅订阅之间进行选择。 保持默认状态并转到“订阅者”屏幕(图28)。

图26:选择发布

图27:推或拉

图28:目标数据库

在这里您需要选择您的服务器并选择ReplB数据库。

下一个屏幕允许您设置“分发代理安全性”(图29)。

图29:分发代理安全性

单击右侧的小省略号按钮,然后选择“在SQL Server代理服务帐户下运行”,打开的窗体中(图30)。

图30:选择一个帐户

点击“确定”,然后点击“下一步”进入“同步时间表”屏幕(图31)。 选择“连续运行”,然后进入“初始化订购”屏幕(图32)。 保留默认值,立即初始化,然后“下一步”到“向导操作”表单(图33)。

图31:同步计划

图32:初始化

图33:向导操作

与之前一样,保留默认值(创建订阅)并单击“下一步”,可以进入摘要屏幕(图34),并显示要执行的操作列表。 点击“完成”开始该过程,并等待绿色成功标志出现在最终的表格上(图35)。

图34:向导摘要

图35:执行状态]

成功!

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实例),但分发数据库必须是分开的。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

你造吗,Oracle SQLplus 也有History命令了

很多时候我们只能通过SQLPlus来操作数据库,而当一个SQL执行结果太多时,我们要回翻之前的SQL语句就会很麻烦,甚至可能由于ssh客户端或SQLPlus客户...

34250
来自专栏jiajia_deng

使用七牛云对象储存缓存 wordpress 静态文件加速网站

31930
来自专栏北京马哥教育

这8种命令都不会,还算什么Linux运维!

01 查看系统内核版本 显示了系统名称(CentOS)和内核版本(release 6.5) The file /etc/issue is a text file...

37170
来自专栏王磊的博客

ReactNative环境搭建扩展篇——安装后报错解决方案

之前一篇写了《逻辑性最强的React Native环境搭建与调试》说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以...

37280
来自专栏北京马哥教育

自动补全不算什么,一键直达目录才是终极神器

在命令行中切换目录是最常用的操作,不过很少有比一遍又一遍重复“cd ls cd ls cd ls ……”更令人沮丧的事情了。如果你不是百分百确定你想要进入...

37270
来自专栏python3

diango使用数据库

之前写的页面,虽然和用户交互得很好,但并没有保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。

17130
来自专栏FreeBuf

闲聊Windows系统日志

最近遇到不少应急都提出一个需求,能不能溯源啊?这个事还真不好干,你把证据,犯案时间都确定的时候,要求翻看监控(日志)对应犯罪嫌疑人时,突然说监控(日志)没有记录...

1.6K00
来自专栏jiajia_deng

使用七牛云对象储存缓存 wordpress 静态文件加速网站

17260
来自专栏数据和云

深入内核:监听器的工作原理与故障诊断分析

熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 在Oracle的官方文档《Oracle Database PerformanceT...

49570
来自专栏安恒信息

安全漏洞公告

1 Linux Kernel 'linux-image-3.2.0-4-5kc-malta'软件包拒绝服务漏洞Linux Kernel 'linux-image...

34170

扫码关注云+社区

领取腾讯云代金券