当前位置: 首页 > 编程日记 > 正文

通往SQL Server复制的阶梯:一级- SQL服务器复制介绍

链接:http://www.sqlservercentral.com/articles/Stairway+Series/72274/

文章:Stairway to SQL Server Replication: Level 1 - Introduction to SQL Server Replication

 通往SQL Server复制的阶梯:一级- SQL服务器复制介绍

By Sebastian Meine, 2012/12/26

该系列

 

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

 

SQL复制可以解决运行数据库驱动的应用程序中的许多问题。发布/订阅模型并不完全容易理解,脚本和监控复制系统的复杂性需要一些思考。在这里,最后是一系列的文章,这些文章将会为所有类型的SQL服务器复制提供一种无术语的方法。

级别1:SQL Server复制的介绍

主条目:rep-li-ca-tion

 

发音:\ re-pl ?——“ka-sh ? n \

 

功能:名词

 

日期:14世纪

“复制”这个词来源于拉丁语“复制”,意思是重复。复制描述了复制或复制的过程(www.merriam - webster.com)。

 

SQL Server中的复制就是这样做的;它复制或复制数据。任何时候,您需要创建数据的副本,或复制该数据的更改,都可以使用复制。该副本可以在相同的数据库中创建,也可以在独立服务器上的远程位置创建。

 

该副本可以与源数据保持同步,或按预定的时间间隔同步。单向同步和双向同步是可能的。复制甚至可以用来使几个数据集保持同步。

 

在第一个级别中,我将介绍基本的复制组件,并描述它们如何协同工作,以允许您复制数据和数据更改。我们还将查看设置简单复制场景的详细示例。

 

复制组件

 

SQL Server复制由三个组件组成:发布者、分发服务器和订阅者。这些组件作用于出版物和订阅中定义的文章。

 

文章

 

对于应该复制的每个SQL Server对象,需要定义复制文章。每一篇文章都对应一个SQL Server对象,或者一个对象的一个子集。被复制的对象通常是表、视图和存储过程。对于可以复制的对象的完整列表,可以在线查看图书的发布数据和数据库对象。一篇文章的属性决定了文章是否包含整个对象,或者是否经过筛选的对象子集组成了复制的文章。通过一些限制,可以在单个对象上创建多个文章。

 

出版

 

一组逻辑上属于一起的文章可以合并成一个出版物。该出版物有定义适用于该出版物中的所有文章的选项。发行版定义的主要选项是要使用的复制类型。

 

出版商

 

用于复制的发布的SQL服务器实例称为发布者。

 

发布者监视所有更改的文章,并向分发服务器提供有关更改的信息。

 

经销商

 

该分发服务器是SQL Server实例,它跟踪所有订阅者,并对所有已发布的更改进行跟踪,并确保每个订阅者都得到每个更改的通知。大多数更改都在分发数据库中进行跟踪。分发服务器可以是一个单独的SQL服务器实例,但分发服务通常与发布服务器运行在同一台机器上。

 

订阅者

 

订阅者是通过订阅接收所有已发布信息的SQL服务器实例。

 

订阅

 

订阅是出版物的副本。订阅定义了哪个服务器(订阅者)将接收发布中发布的更新。每个订阅在一个发布和一个订阅者之间创建一个链接。订阅有两种类型:推送订阅和吸引订阅。在推送订阅中,分销商直接更新订阅者数据库中的数据。在pull订阅中,订阅服务器定期向分发服务器询问是否有任何新的更改,然后更新数据本身。

 

复制类型

 

在SQL Server中有三种主要的复制类型。它们是快照复制、合并复制和事务复制。

 

快照复制

 

快照复制在每次运行时创建复制对象及其数据的完整副本。它使用sqlserver的BCP实用程序将每个表的内容写入快照文件夹。快照文件夹是在启用复制时必须在分发服务器上设置的共享文件夹位置。复制设置中的每个参与者都需要访问快照文件夹。

 

每次运行快照复制时,一切都是从头开始,因此它具有高带宽和存储需求。默认情况下,所有其他类型的复制都使用一个复制快照,仅在初始设置期间将所有订阅服务器与分发服务器同步。

 

事务性复制

 

事务性复制的工作方式,顾名思义,是基于事务的。每一个提交的事务都会被扫描到用于复制文章的更改。对更改的扫描是通过日志读取器代理完成的,该代理读取发布服务器数据库的事务日志。如果有更改影响已发布的对象,则这些更改将登录到分发数据库的分发服务器。他们从那里开始向订户们前进。

 

事务性复制允许接近实时同步,并且只给发布者留下很小的足迹。虽然有几种允许双向数据移动的选项,但事务性复制最初只是设计为单向的。

 

合并复制

 

合并复制是从一开始就设计的,允许对发布服务器和订阅方的数据进行更改。合并复制还允许断开连接的场景,其中用户可能在白天不连接。该订户将在晚上重新连接后进行同步。如果一行在两个不同的地方同时更新,就会发生冲突。合并复制附带了几个用于解决这些冲突的选项。

 

设置事务复制

 

本节将逐步指导如何设置包含单个复制表的事务复制。

 

要设置复制,需要配置分发服务器、发布者和订阅者。可以使用t - sql脚本完全地设置和控制复制。但是,必要的t - sql涉及到使用存储过程,这些存储过程总共有超过100个必需的参数。因此,使用ssms - gui开始是有意义的。这里显示的示例屏幕截图是在一个服务器上(WIN2008A)上安装的,上面安装了一个sql - server实例(R2A)。这个实例是一个sql - server 2008R2实例。但是,您也可以参考SQL Server 2008和2005的示例。

 

建立分布

 

分发服务器是事务性复制的核心。在设置所有其他组件时,需要提供它,因此需要首先配置它。

 

从打开SSMS开始,连接到包含复制源数据的sql - server实例。虽然分发服务器可以在自己的sql - server实例上,但在许多情况下,让发布者和分发服务器都生活在同一台机器上是有意义的,正如本例中所假定的那样。

 

连接到服务器后,右键单击服务器下的“复制”文件夹并选择“配置分发…”如图1所示。

图1:配置分布

 

配置分布向导将以其启动屏幕向您表示欢迎,如图2所示。

 

图2:配置分发向导

 

忽略此屏幕并单击“Next”是安全的。

 

在下一个屏幕(图3)中,您将选择分发服务是否应该在该服务器上运行,或者您的网络中是否已经有一个已配置的分发服务器。分发服务运行的机器也将包含分发数据库。在缺省情况下保留此选择,即在此服务器上安装分发版并单击“Next”。

 

图3:选择分发服务器

 

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

 

图4:快照文件夹

 

快照文件夹可以是您的机器上的任何位置,也可以是您的网络中的任何位置。为它创建一个网络共享是有意义的。这个示例使用“\ \ WIN2008A \ ReplicationSnapshotFolder”。

 

快照文件夹的设置要求授予适当的权限。现在,不要过多地讨论细节,授予对“已验证用户”(图5)的访问权限,并读取“每个人”的访问权限(图6)。有关如何加强这一地区的安全的更多信息将在这个楼梯的稍后一层给出。

 

图5:允许访问快照文件夹

 

图6:允许访问快照文件夹共享

 

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

 

图7:分布数据库

 

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

 

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

 

 

图8:出版商做准备

 

图9:向导操作

 

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

 

现在您将看到一个操作列表,如图10所示。点击“Finish”开始这个过程。

 

图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对象资源管理器中打开复制文件夹并右键单击“本地发布”。选择“新出版…在下拉菜单中(图12)。

 

图12:新的出版物

 

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

 

图13:配置发布向导

 

单击“下一步”。

 

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

 

图14:选择发布数据库

 

图15:出版类型

 

现在您可以选择该发布的哪篇文章(图16)。dbo选择表。测试并再次点击“Next”,以移动到“过滤器表行”对话框(图17)。过滤器是一个高级的主题,它将在后面的楼梯中被覆盖,所以现在只需点击“Next”,而不需要在这个表单上做出选择。

 

图16:文章

 

图17:行过滤器

 

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

 

图18:快照时间表

 

图19:代理安全性

\

图20:选择一个帐户

 

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

 

这就引出了“向导操作”表单(图21),供您选择“创建发布”。最后一次点击“Next”会将您带到摘要屏幕(图22)。


图21:向导操作


图22:向导总结

 

在这里,您需要为发布选择一个名称。在字段中键入“MyFirstPublication”,然后单击“Finish”启动进程。同样,最后一个屏幕(图23)显示了进程结束时的进度信息和成功状态。

 

图23:执行状态

 

第一次订购

 

在大多数情况下,订阅服务器将位于不同的机器上,但是您希望它位于同一实例上的场景。为了保持这个示例的简单性,我们将继续使用相同的实例。使用脚本2中的代码:创建数据库ReplB。

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

脚本2:创建目标数据库

 

现在我们访问SSMS对象资源管理器,右键单击“本地订阅”并选择“新订阅……”在下拉菜单中(图24)。

 

图24:选择新订阅

 

“新订阅向导”(图25)欢迎您,并为您提供另一个练习按下“Next”按钮的机会。

 

图25:新的订阅向导

 

在“发布”表单中(图26)选择您刚刚创建的发布,并单击“Next”。“分布代理位置”屏幕(图27)允许您在push和pull订阅之间进行选择。保留默认值并移动到“订阅者”屏幕(图28)。

 

图26:选择发布

 

图27:推或拉

 

图28:目标数据库

 

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

 

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

 

图29:分发代理安全性

 

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

 

图30:选择一个帐户

 

点击“OK”,然后“Next”将您带到“同步计划”屏幕(图31)。选择“连续运行”并转移到“初始化订阅”屏幕(图32)。保留默认值,立即初始化,然后“下一步”到“向导操作”表单(图33)。

 

图31:同步时间表

 

图32:初始化

 

图33:向导操作

 

如前所述,保留默认值(创建订阅)并单击“Next”,您将看到一个即将执行的操作列表(图34)。单击“Finish”启动进程,等待绿色成功标志出现在最终表单上(图35)。

 

图34:向导总结

 

图35:执行状态

 

成功!

 

Script1创建了表dbo。在ReplA中测试并插入1000行。在初始快照转移到订阅服务器之后,您将找到dbo。测试表也在ReplB中包含了所有1000行。完成设置后的几分钟,您可以运行脚本3来验证复制是否按预期将所有数据推送到订阅服务器。此脚本与ReplA.dbo连接。测试和ReplB.dbo。测试表一起显示哪些行被正确复制。您现在可以运行自己的进一步测试,您可以在ReplA.dbo中插入和更新行。测试和观察这些变化会神奇地出现在replb . dbo中。测试。

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服务器实例中,被标记为复制的发布者的数据库中的对象称为文章。文章被分组到出版物中。订阅方通过订阅对文章的更改进行更新。数据流经分布在分发服务器上的数据库。发布者、分发服务器和订阅者可以是同一个实例,也可以是在相同或不同机器上的独立实例。源数据库和目标数据库可以是相同的(如果发布者和订阅者实际上是相同的SQL Server实例),但是分发数据库必须是独立的。

 

转载于:https://www.cnblogs.com/1-1-1-1-2/p/8124850.html

相关文章:

【青少年编程】【三级】青蛙捕虫

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

UI培训教程分享:UI设计的分类有哪些?

本期为大家介绍的UI培训教程是关于UI设计分类这块的,在UI设计中,我们常应用到的终端设备可大致分为三类,分别为移动端UI设计、PC端UI设计、其他终端UI设计。 UI培训教程分享:UI设计的分类有哪些? 1. 移动端UI设计 移动端一般指移…

slider(滑动条)控件模版,样式--用图片定义控件模版

初接触wpf,想自己用图片做一个个性slider滑块控件,网上找了很久无果。后来一些机缘巧合看别人源码的时候找到了类似的,然后自己再查了一下msdn,大概弄懂了。 我们先来看看slider控件组成元素。 Slider控件组成: 用图片…

360浏览器调用selenium

2019独角兽企业重金招聘Python工程师标准>>> 360浏览器调用selenium package com.demo;import java.io.File; import java.io.IOException;import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver;…

【组队学习】【28期】R语言数据科学

R语言数据科学 论坛版块: http://datawhale.club/c/team-learning/36-category/36 开源内容: https://github.com/datawhalechina/team-learning-program/tree/master/RLanguage 学习目标 向零基础的同学介绍如何利用R语言进行数据分析。通过学习&…

零基础参加Java培训班合适吗

零基础参加Java培训班合适吗?对于这个问题,首先答案是肯定的,零基础学习java技术最靠谱最快速的方法就是报java培训班进行学习了,来看看下面的详细介绍就知道了。 零基础参加Java培训班合适吗? 能够想到参加Java培训班学习的同学一般分为三…

用VS(c#)创建、调试windows service以及部署卸载

同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试、部署、卸载。 一、创建windows service 1. 打开VS2008,新建一个Project, Project类型选择Visual C#-Windows,在Templates…

【组队学习】【28期】基于Python的会员数据化运营

基于Python的会员数据化运营 论坛版块: http://datawhale.club/c/team-learning/37-category/37 开源内容: https://github.com/datawhalechina/team-learning-data-mining/tree/master/MemberOperations 学习目标 数据化运营是业务知识与编程技能…

异步系统接口调用流程图

2019独角兽企业重金招聘Python工程师标准>>> 异步系统接口调用流程图 博客分类: java ................................... 转载于:https://my.oschina.net/xiaominmin/blog/1597725

java培训教程分享:Java中用户如何自定义异常?

我们在学习java技术的时候应该有了解过,在java中是定义了很多的异常类的,虽然这些大量异常类可以帮助我们描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在设计divide()方法时不允许…

【组队学习】【28期】基于transformers的自然语言处理(NLP)入门

基于transformers的自然语言处理(NLP)入门 论坛版块: http://datawhale.club/c/team-learning/39-category/39 开源内容: https://github.com/datawhalechina/Learn-NLP-with-Transformers 学习目标 自然语言处理(Natural Language Pro…

java io在文件结尾持续添加内容

[代码] java io在文件结尾持续添加内容 public static void write(String path, String content) {try {File f new File(path);BufferedWriter output new BufferedWriter(new FileWriter(f,true));output http://www.szhaoexport.com/linked/20130222.do; .write(content &…

Docker1.12让容器使用和宿主机同一个网段

2019独角兽企业重金招聘Python工程师标准>>> Docker1.12让容器使用和宿主机同一个网段 博客分类: docker 由于开发的一些特殊需求,需要将容器部署在与宿主机同一个网段中,部署步骤如下:步骤一:创建网络$ …

java培训分享:java培训架构师学习线路图

本期java教程分享主要是讲解关于java培训架构师方面的内容,主要针对java架构师的学习线路图进行一个知识点的概括,下面来看看学习java架构师都需要了解哪些内容吧。 java培训分享:java培训架构师学习线路图 1、常见模式与工具 学习Java技术体…

设计中涉及到的dip、dp、px、sp等单位说明

在进行UI设计中常会遇到各种数值单位,开始使用时也常搞混,于是搜集了单位解说的文章与大家一同分享 dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用…

【组队学习】【28期】Datawhale组队学习内容介绍

第28期 Datawhale 组队学习活动马上就要开始啦! 本次组队学习的内容为: 吃瓜教程——西瓜书南瓜书李宏毅机器学习动手学数据分析集成学习SQL编程语言R语言数据科学基于Python的会员数据化运营数据采集从入门到精通基于transformers的自然语言处理(NLP)入…

多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?...

如果所有线程都只读取该变量的话不必加锁,因为仅读取不存在破坏数据的风险,如果有线程写该变量的话不管读取还是写入都要加锁的。

java培训教程分享:Java编写软件代码自动提示功能

本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能,以下是介绍 Eclipse for android。 java培训教程分享&#x…

iOS WebviewJavascriptBridge 源码研读笔记

这两天接近元旦,事情稍微少些,有些时间,索性写点什么,就从最擅长的iOS混合开发写起了,由于iOS开发经验不到四年吧,期间还搞了一年半的前端,有些知识可能还是积累的不足,能力不足&…

Debian上网的问题小结

装完系统或装系统中很重要的部分就是配置网络的问题了,记得刚安装Debian的时候还不知道dhclient eth0真是杯具。 关于怎么设置识别网卡su->输入root密码->nano /etc/network/interface然后分情况,如果你是有线的且只有一个网卡,就叫eth…

【组队学习】【28期】青少年编程(Scratch 一级)

青少年编程(Scratch 一级) 论坛版块: http://datawhale.club/c/team-learning/34-category/34 开源内容: https://github.com/datawhalechina/team-learning-program/tree/master/Scratch 学习目标 全国青少年软件编程等级考…

java培训教程分享:Java中怎样将数据对象序列化和反序列化?

本期为大家介绍的java培训教程是关于“Java中怎样将数据对象序列化和反序列化?”的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的…

C#实现的几种委托

//普通委托DeleteShow ds new DeleteShow(ShowName);Console.WriteLine("----------------------");Console.WriteLine("普通委托----请输入用户名:");string Name Console.ReadLine();Console.WriteLine(ds(Name));Console.WriteLine("-----------…

AFN框架使用整理

1.AFN框架基本使用 1 AFN内部结构 AFN结构体 NSURLConnection(iOS9.0废弃了) AFURLConnectionOperationAFHTTPRequestOperationAFHTTPRequestOperationManager(封装了常用的 HTTP 方法) 属性 baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类&a…

【青少年编程】【一级】小镇一日游

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

参加java培训后,就业方向有哪些

参加java培训后,就业方向有哪些?很多正在参加java培训的同学对这个问题都比较关注,那么下面小编就针对这个问题为大家做下详细的介绍,希望能够帮助到大家。 参加java培训后,就业方向有哪些?首先我们来了解一下Java的应用领域&am…

访问本地文件403

电脑不知道怎么设置的根目录下看不到所有文件夹 而且打开一个新的文件夹显示 Forbidden You dont have permission to access /atina/ on this server. 最后没办法只能手动把文件夹加上权限 chmod -R 777 atina //-R 递归修改,“/文件夹/“以下所有内容&#xff08…

iOS微信支付集成 SDK1 7 5

最近做了一个新项目,涉及到支付宝和微信支付,支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已),这是继上篇支付宝支付集成后接着的微信支付集成。 1.微信商户申请步骤…

【青少年编程(第26周)】一下子多了很多事!

2021年08月15日(周日)晚20:00我们在青少年编程竞赛交流群开展了第二十六次直播活动。我们直播活动的主要内容如下: 首先,我们奖励了上周测试超过60分的小朋友。 其次,介绍了Datawhale青少年组队学习活动的规划&#x…

Python培训教程分享:10款超好用的Python开发工具

学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python开发工具! Python培训教程分享:10款超…