SQL Server复制的阶梯:第1级 - SQL Server复制简介

本翻译文章来自作者:Sebastian Meine, 2012年12月26日

该系列

本文是Stairway系列的一部分:SQL Server复制的阶梯

SQL Replication可以解决运行数据库驱动的应用程序中的许多问题。发布/订阅者模型不是很容易理解,脚本和监视复制系统的复杂性需要一些思考。最后,这是一系列文章,它们负责制作所有类型的SQL Server Replication的无术语方法。

第1级:SQL Server复制简介

复制这个词来自拉丁文“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开始是有意义的。此处显示的示例屏幕截图是在单个服务器(WIN2008A)上安装的,其中安装了SQL-Server实例(R2A)。此实例是SQL-Server 2008R2实例。但是,您也可以按照SQL Server 2008和2005上的示例进行操作。

设置分发

分发服务器是事务复制的核心。在设置所有其他组件时需要它可用,因此需要先进行配置。

首先打开SSMS并连接到包含复制源数据的SQL-Server实例。虽然分发服务器可以位于自己的SQL服务器实例上,但在许多情况下,让发布者和分发者在同一台机器上运行是有意义的,这将在本示例中假设。

连接到服务器后,右键单击服务器下的“复制”文件夹,然后选择“ ...”,如图1所示。

图1:配置分发

配置分发向导将通过其启动屏幕向您致意,如图2所示。

图2:配置分发向导

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

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

图3:选择分发服务器

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

图4:快照文件夹

 

图5:分发数据库

在此处指定分发数据库的名称以及其数据和日志文件的位置。保留默认值并单击“下一步”进入“发布者”屏幕(图6)。

在“发布商”屏幕上,您可以让潜在的发布商准备好使用此发布商。我们将在同一个实例上安装我们的

发布者,因此您可以将默认值和“Next”保留为最终问题(图7)。

 

图6:准备发布者

 

图7:向导操作

最后一个问题是您是否希望向导立即执行您的选择,或者您是否希望向导创建将在以后手动执行的脚本。再次,保留默认设置,最后一次单击“下一步”。

现在,您将看到将要执行的操作列表,如图8所示。单击“完成”以启动该过程。

 

图8:向导摘要

最后,图9中显示的屏幕提供了有关复制配置的进度和成功的信息。

 

图9:执行状态

第一个出版物

要创建发布,我们需要首先拥有一个包含要发布的表的数据库。执行SQL脚本1以为发布创建测试数据库。

USE MASTER;GOEXECUTE 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

1000USE MASTER;

GO

REVERT;

GO

脚本1:为发布创建测试数据库

现在您已准备好设置出版物。

在SSMS对象资源管理器中,打开“复制”文件夹,然后右键单击“本地发布”。在下拉菜单中选择“New Publication ...”(图12)。

图12:新出版物

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

图13:配置发布向导

点击下一步”。

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

 

图14:选择发布数据库

 

 

 

图15:发布类型

现在您可以选择哪些文章应该成为本出版物的一部分(图16)。选择表dbo.Test并再次单击“Next”以转到“Filter Table Rows”对话框(图17)。过滤器是一个高级主题,将在此Stairway的更高级别中介绍,因此现在只需单击“下一步”而不在此表单上进行选择。

图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)允许您在推送和拉取订阅之间进行选择。保留默认值并转到“Subscribers”屏幕(图28)。

图26:选择发布

 

 

图27:推或拉

 

 

 

图28:目标数据库

 

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

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

图29:分发代理安全性

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

图30:选择一个帐户

单击“确定”,然后单击“下一步”,将进入“同步计划”屏幕(图31)。选择“连续运行”并转到“初始化订阅”屏幕(图32)。保留默认值,立即初始化,然后“Next”到“Wizard Actions”表单(图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实例),但分发数据库必须是独立的。

本文是 SQL Server复制阶梯的阶梯的一部分

注册我们的RSS源,并在我们在Stairway发布新关卡后立即收到通知!

 

SQL Server复制的阶梯的更多相关文章

  1. 第十六周翻译-SQL Server复制的阶梯:第1级 - SQL Server复制简介

    SQL Server复制的阶梯:第1级 -  SQL Server复制简介 作者:Sebastian Meine,2012年12月26日 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部 ...

  2. SQL Server复制

    SQL Server复制的阶梯:级别1-SQL Server复制介绍 By Sebastian Meine, 2012/12/26 原文链接:http://www.sqlservercentral.c ...

  3. SQL Server 无法连接到服务器。SQL Server 复制需要有实际的服务器名称才能连接到服务器。请指定实际的服务器名称。

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html SQL性能优化汇总篇:http://www.cnblogs.com/dunit ...

  4. SQL Server 复制系列(文章索引)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 前言(Introduction) 复制逻辑结构图(Construction) 系列文章索引(Catalog) 总结&am ...

  5. SQL Server复制出错文章集锦

    SQL Server复制出错文章集锦 为了方便大家对数据库复制过程中出错的时候更好地解决问题 本人收集了SQL Server相关复制出错解决的文章   The process could not ex ...

  6. 玩转SQL Server复制回路の变更数据类型、未分区表转为分区表

    玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 ...

  7. SQL Server 复制订阅

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案/高可用 概述 配置复制就没有数据库镜像和AlwaysOn的要求那么高,只需要两台服务器能通过TCP进行通讯即可,两 ...

  8. SQL Server 复制:事务发布

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...

  9. SQL Server复制需要有实际的服务器名称才能连接到服务器

    服务器上安装的WIN2008 R2,然后没有在意机器名,安装了SQL2008 R2数据库之后,配置AD域的时候修改了机器名. 然后,开始配置数据库镜像同步的时候,先试了下数据库复制发布,结果提示“SQ ...

随机推荐

  1. 简单的数据结构_via牛客网

    题面 链接:https://ac.nowcoder.com/acm/contest/28537/K 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  2. python 操作xml、html文件

    简介 在一些项目中可能会使用到解析html文件,尤其是爬虫相关的,需要解析获取到的html内容,通常我们会使用lxml模块去进行html文件的解析. html文件 当前存在一个简单的html < ...

  3. 调和级数为什么是 O(logn) 的

    目录 调和级数 正片 调和级数 调和级数(Harmonic series)定义为 \[H(n)=\sum_{i=1}^n\dfrac 1i \] \(H\) 发散,证明看百度 . 正片 首先我们把 \ ...

  4. 万答#1,MySQL中如何查询某个表上的IS(意向共享)锁

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 问题 问题原文是这样的: 假如在MySQL事务里,给某个表的一行加了 共享锁,理 ...

  5. Apache SeaTunnel (Incubating) 2.1.0 发布,内核重构、全面支持 Flink

    2021 年 12 月 9 日,SeaTunnel (原名 Waterdrop) 成功加入 Apache 孵化器,进入孵化器后,SeaTunnel 社区花费了大量时间来梳理整个项目的外部依赖以确保整个 ...

  6. HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师

    [导读] 随着音视频内容品类的不断丰富及音乐创作门槛不断降低,大量用户正热切的参与到全民创作的大潮中.我们应该怎么去拥抱移动端影音潜力市场?音频编辑又可以有什么新玩法? 本期直播<音随我动,秒变 ...

  7. 用GitHub Actions自动部署Hexo

    什么是 GitHub Actions ? GitHub Actions 是一个 CI/CD(持续集成/持续部署)工具,GitHub 于 2018 年 10 月推出,正式版于 2019 年 11 月正式 ...

  8. 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)

    昨天教练问我:你用树剖做这道题,怎么全部清空状态呢?    我:???不是懒标记就完了???    教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清?    我:为什么要建很多棵线段树? ...

  9. uniapp+.net core 小程序获取手机号

    获取手机号 从基础库 2.21.2 开始,对获取手机号的接口进行了安全升级,以下是新版本接口使用指南.(旧版本接口目前可以继续使用,但建议开发者使用新版本接口,以增强小程序安全性) 因为需要用户主动触 ...

  10. 美团组件化事件总线方案改进:ModularEventBus

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...