数据库复制(一)–复制介绍

数据库复制(一)–复制介绍

介绍:

在运行着的数据库驱动的应用程序中,SQL复制能解决许多问题。由于发送/订阅的模式不是十分容易理解,复杂的脚本语言和监视复制系统也是需要一定的思想在里面。希望在接下来的几个章节中能尽量将基本原理和操作阐述的详细完整些,便于大家理解。

在SQLServer中,复制就是产生或复制数据;比如你需要去创建一个你数据的副本,或者复制一个那份数据的改变,SQL复制就派上用场了。

复制的副本可以在同一个数据库中也可以在远程的分隔的服务器上。

副本与源数据保持实时同步,或者在规定时间间隔内保持同步。单步同步方式,就像双向同步一样都是可行的,复制甚至能被用来保持多个数据集之间彼此的同步。既然有这么多优点,那我们就迫不及待的开始学习复制吧,当然一开始先要描述一些基础信息,比如基本的复制组件和这些组件如何组合在一起来实现复制。Come on!

复制的组成:

SQL Server 复制主要由三部分组成:出版商,经销商和订阅者,这些组件作用于发行和订阅服务器内部的文章上。

通过命名我们就能推想出来,复制很像报纸杂志的发行,可以简单理解它的一般流程:出版–》经销–》订阅。

文章(复制的对象)

对于每个应该被复制的对象,一个复制文章需要被定义。每个文章对应着一个见得SQLServer对象或者一个对象的子集。这个被复制的对象通常就是表、视图、或者存储过程。当然也可以在单个文章中创建多个对象。

出版物(对象的集合)

一组在逻辑上在一起的文章(复制的对象)被混合成一个出版物。这个出版物有公共的被定义的可选项,主要的选项就是复制的类型。

出版商(发布服务器)

一个提供复制的出版物的SQL Server 实例被叫做出版商。出版商监视所有改变的文章,并且将这些改变通知给经销商。

经销商(分发服务器)

经销商是既要追踪所有的订阅者又追踪所有的发布者的改变,同时要保证任何一个改变都会被每一个订阅者知晓。绝大多数的改变在分发服务器中被追踪到。尽管经销商能作为一个独立的数据库实例,但是通常情况下分发服务器会运行在出版商的机器上。

订阅者(订阅服务器)

订阅者可以看做是能够通过订阅的方式接收发布的所有信息的数据库实例。

订阅

订阅是相对于发布而言的,订阅定义了哪一个订阅服务器将要去接收来自发布服务器发布的更新。每个订阅创建了一个在发布者和订阅者之间的链接。有两种订阅方式,推送订阅(Push)和请求订阅(Pull)。

在推送订阅的情况下,分发服务器直接在订阅服务器数据库更新订阅的数据;

而在请求订阅的模式下,需要订阅服务器定期查询分发服务器是否有可用更新,如果存在任何的可用更新,那么订阅服务器自己完成更新数据。

 

复制的类型

在SQLServer 中主要有三种可用的复制类型,它们分别是:快照复制、合并复制和事物复制。

快照复制

快照复制就是每次运行都创建一个完整复制对象和对象数据的副本。它使用数据库的BCP 工具来写入每个表的内容到快照文件夹中。快照文件夹是一个共享的文件夹地址,在启动复制的时候这个地址必须被建立在分发服务器上。并且每个参与者都是有权限访问快照复制的文件夹的,需要在设置复制的时候进行设置。

这种模式缺点是:每次快照复制运行,都要所有的一切从头再来一遍,因此它会占用很高的带宽和存储。

需要了解的是,所有其他类型的复制在初始化设置的时候都要使用一个简单的复制快照来同步给所有的订阅者和经销商一个复制。

事务复制

顾名思义,就是以事务为基础。对于每一次提交的事务的变更都要被扫描到复制的文章中。事务日志读取代理扫描这些被做的变更,它读取发布数据库的事务日志。假如有改变影响了发布的对象,那么这些改变将被日志记录在分发数据库,然后分发数据库再选用合适的方式发送给订阅者。

事务复制可用作接近实时的同步,同时仅仅留下一些痕迹在发布方。尽管有一些选择项可以考虑使用双向数据移动,但是事务复制一开始就被设计为单向的模式。

合并复制

 

合并复制即允许发布服务器更新数据库,也允许订阅服务器更新数据。定期将这些更新进行合并,使得发布的数据在所有的节点上保持一致。因此,有可能发布服务器和订阅服务器更新了同样的数据,当冲突产生时,并不是完全按照发布服务器优先来处理冲突,而是根据设置进行处理,这些会在后续文章中讲到。

 

设置事务复制

这部分是一个一步一步的关于如何配置事务复制包括单边复制的指导。为了配置复制,分发者、发布者以及订阅者都需要被配置。复制可以通过使用T-SQL脚本来完整的配置和控制。但是会使用唱过太多繁琐的参数,因此我们将通过使用SSMS 来配置。这里我们使用了SQLServer2008 R2 版。

配置分发

分发环节是事务复制的核心。它是其他所有组件的先决条件,因此它需要首先配置。

进入SSMS,然后在左侧菜单栏右键点击”Replication”文件夹,选择配置分配,如图1:

<span>数据库复制(一)--复制介绍</span>

图 1

配置分配的向导

<span>数据库复制(一)--复制介绍</span>

图 2: 配置向导

向其他软件一样,NEXT即可。接下来你想要去选择是否在本服务器上运行分发服务还是你已经在网络上有一个配置好的分发服务器。这里我们选择默认的在本服务起上安装分发服务,然后点击”Next”。如图3

<span>数据库复制(一)--复制介绍</span>

图 3

接下来就是对话框,要求你选择快照文件夹的路径。如图4

<span>数据库复制(一)--复制介绍</span>

图4

快照文件夹可以被放置在你的机器上或者网络上。当然,在分发服务器上创建一个网络共享是很有价值的。这里的例子就是使用了这个\\WIN2008A\ReplicationSnapshotFolder  地址。

快照文件夹的设置也需要适当的权限去授权。这里没必要太多去研究细节,我们授予写权限给”Authenticated Users” (图 5)在这个文件夹上,读权限授予”Everyone” (图6)共享。

<span>数据库复制(一)--复制介绍</span>

图 5

<span>数据库复制(一)--复制介绍</span>

图6

在你共享并且将网络地址输入到向导的输入地址后,点击“下一步”前往你分发数据库的窗口 。如图7:

<span>数据库复制(一)--复制介绍</span>

图 7

你需要制定分发数据的名字和数据及日志的放置位置。其他的默认选项就好,点击”Next”进一步来到发布者窗口(图8)

在发布环节需要准备好潜在的发布者来使用分发者。我们来安装发布的在相同的实例上,在这里除了默认选项直接店家下一步到最后一个环节(图9)

<span>数据库复制(一)--复制介绍</span>

图 8:准备发布者

<span>数据库复制(一)--复制介绍</span>

图 9

最终的问题就是你是否要去立即执行的你的选项还是你想去创建脚本在一段时间以后在执行?再一次默认配置,最后一次点击下一步。现在你就能看到一个任务列表在图10 中。点击 “Finish” 开启这个进程

<span>数据库复制(一)--复制介绍</span>

图 10:

最终,这个屏幕将展示如图11.给出关于进度和复制配置成功的信息。

<span>数据库复制(一)--复制介绍</span>

图11

第一次发布

来创建一个发布,我们需要首先有个包含表的数据来发布。执行下面脚本中的代码来创建一个测试数据库

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

Script 1:创建测试数据库及表

现在准备好设置发布。

在SSMS对象浏览器中打开复制文件夹右键单击”Local Publication”。在下拉菜单中选择”New Publication…”

<span>数据库复制(一)--复制介绍</span>

图12: New Publication

在图13中向导界面出现了

<span>数据库复制(一)--复制介绍</span>

图 13: 配置发布向导

单击 “Next”.

在发布数据库的选择框选择你刚刚创建的数据库,我这里是ReplA ,单击下一步,选择你要使用额度复制类型。选择事务复制,单击下一步在图15

<span>数据库复制(一)--复制介绍</span>

图14:

<span>数据库复制(一)--复制介绍</span>

图15: 选择复制类型

现在你将去选择哪个对象组作为发布的文章。图16.选择表dbo.Test  单击下一步,继续去过滤标的行在图17中。过滤部分的进阶内容在接下来的章节介绍。到目前为止只需要单击下一步不再做其他选择即可。

<span>数据库复制(一)--复制介绍</span>

图16: 复制对象

<span>数据库复制(一)--复制介绍</span>

图17: 行过滤

接下来三个环节就是处理快照代理图18,选择”Create a snapshot immediately” 然后点击下一步。在”Agent Security” 窗口(图19)点击”Security Settings” 按钮,然后选择”Run under the SQL Server Agent service account” 在图20中。

<span>数据库复制(一)--复制介绍</span>

图18

<span>数据库复制(一)--复制介绍</span>

图19

<span>数据库复制(一)--复制介绍</span>

图 20: 选择账户

点击”OK”在表格中,然后选择”Next” 在代理安全窗口。接下来就是任务向导图21,选择”Create the publication”。单击下一步进入到最后的窗口图22

<span>数据库复制(一)--复制介绍</span>

图21: 向导

<span>数据库复制(一)--复制介绍</span>

图 22

在这你需要选择一个发布的名称。输入”MyFirstPublication”进入文本点击”Finish” 来开启这个进程。下面就是进度信息和状态图22

<span>数据库复制(一)--复制介绍</span><span>数据库复制(一)--复制介绍</span>

图 23

第一个订阅

在绝大多数情况下,订阅方在不同的机器上,但是为了保证实例简单我们将选择在同一个实例上配置订阅。使用Script 2: 创建数据ReplB

 

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

Script 2: 创建目标数据库

现在我们进入SSMS对象浏览器右击”Local Subscriptions” 并选择”New Subscriptions…” 如图24

<span>数据库复制(一)--复制介绍</span><span>数据库复制(一)--复制介绍</span>

图 24

在订阅者向导欢迎界面,然后就是一路的下一步

<span>数据库复制(一)--复制介绍</span>

图 25

在“Publication”窗口图26,选择我刚刚创建的发布,点击下一步。在”Distribution Agent Location” 的窗口选择push 或者pull 模式的订阅。其他默认前往订阅窗口图28。

<span>数据库复制(一)--复制介绍</span>

图 26

<span>数据库复制(一)--复制介绍</span>

图27: Push or Pull

<span>数据库复制(一)--复制介绍</span>

图28: 目标数据库

这里你需要选择你的服务并选择ReplB 数据库,接下来下一个窗口设置”Distribution Agent Security” (图29).

<span>数据库复制(一)--复制介绍</span>

图29: Distribution Agent Security

点击右侧小的省略符号按钮,然后选择”Run under the SQL Server Agent service account” 在新打开的窗口图30

<span>数据库复制(一)--复制介绍</span>

Figure 30:

点击“OK” 然后点击下一步,去Synchronization Schedule” 窗口(图31),选择一个”Run continuously” 然后继续去”Initialize Subscriptions”窗口(图32).默认就行。然后立即初始化并且点击下一步去 “Wizard Actions” 窗口(图33)

<span>数据库复制(一)--复制介绍</span>

图31: 同步步骤

<span>数据库复制(一)--复制介绍</span>

图32: 初始化

<span>数据库复制(一)--复制介绍</span>

图33: 执行向导

正如之前,其他的都是默认就好,点击下一步。到最后的窗体(图34),任务列表,点击完成 开始进程,然后等待绿色成功的标志出现在最后的页面(图35)。

<span>数据库复制(一)--复制介绍</span>

图 34: 向导

<span>数据库复制(一)--复制介绍</span><span>数据库复制(一)--复制介绍</span>

图35: Status

成功

脚本1创建的dbo.Test 表在数据库ReplA ,并且插入了1000含数据。在初始化完成快照被转移到订阅者处,可以在这里也发现这个表也在ReplB ,也有1000行数据。在你完成配置之后你能运行Script 3 来验证这个复制推送所有数据给订阅者。连接两个表的脚本4来展示哪一个被复制了。能够进一步运行测试,也能插入和更新ReplA.dbo.Test 然后看看这些改变是否神奇的出现在ReplB.dbo.Test 里面了,哈哈

脚本3

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: 比较订阅者和发布者

总结

在数据库中的对象被称为发布者,就是在被标记为复制的发布者被叫做文章。文章就是组合在一起的复制。订阅者就是获取发生在文章中的更新通过订阅的方式。数据流通过存在于分发者的分发数据库分发。发布者,分发者和订阅者能是相同的实例,也可以是独立的实例在相同或者不同的机器上都可以。源和目的数据库能是相同的,但是分发的数据库必须是独立的。

本篇简答的介绍了复制相关的概念和简单的事务复制的配置和测试。接下来我们将进一步了解更复杂的复制等情况。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119735.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • js数组截取方式splice()和slice()方法

    js数组截取方式splice()和slice()方法js数组截取方式splice()和slice()方法1.splice()splice()方法可以添加元素、删除元素,也可以截取数组片段。删除元素时,将返回被删除的数组片段,因此可以使用splice()方法截取数组片段//传递一个参数,则该方法仅执行删除操作,参数值指定删除元素的起始下标(包含该下标元素)//splice()方法将删除后面所有元素vara=[1,2,3,4,5];//定义数组varb=a.splice(2);//从第三个元素开始执行删除console

  • linux防ddos 软件下载,linux系统防ddos攻击工具

    linux防ddos 软件下载,linux系统防ddos攻击工具DDoSdeflate其实非常简单,下面是详细的安装和配置步骤:1.安装DDoSdeflatewgethttp://www.inetbase.com/scripts/ddos/install.shchmod0700install.sh./install.sh//弹出版权信息后,在SSH下键入q,即可退出版权信息。2.配置DDoSdeflate.安装成功后会提示Config…

  • win10文件访问被拒绝_windows10已拒绝远程连接

    win10文件访问被拒绝_windows10已拒绝远程连接尝试以下方法:1)开启|关闭防火墙(这里需要关闭)sudoufwenable|disable2)开启远程服务在终端界面输入:servicesshdstart。结果显示:ssh:unrecognizedservice。输入查看命令:servicesshstatus显示也是unrecognizedservice。开启远程服务:终端界…

  • windows修改dns服务器,windowns中dns服务器配置与管理详解(多图)

    windows修改dns服务器,windowns中dns服务器配置与管理详解(多图)安装DNS服务器在”服务器管理器”-“角色”-“添加角色”中安装DNS服务器。选择DNS服务器点下一步安装,然后安装固定服务器IP地址安装完DNS和配置好固定ip后,我们就可以开始配置DNS。在”开始”-“管理工具”-DNS打开DNS正向区域的建立并为其设置主机。选择”正向查找区域”-右击-新建区域。填写域名之后全部默认设置,直至完成。域名建立之后,我们就可以为其”新建主机”选择”hzu.com”…

  • js操作元素属性_如何将ajax返回的网页加载出来

    js操作元素属性_如何将ajax返回的网页加载出来session时使用sessionStorage.Storage表示存储的意思。一.设置值sessionStorage.setItem(key,value);设置元素的值,setItem.类似于服务器端的setAttribute();二.得到值vardata=sessionStorage.getItem(key);类似于服务器端的getAttribute…

    2022年10月10日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号