第十六周翻译-SQL Server复制的阶梯:第1级 - SQL Server复制简介
SQL Server复制的阶梯:第1级 - SQL Server复制简介
作者:Sebastian Meine,2012年12月26日
翻译:赖慧芳
译文:
该系列
本文是Stairway系列的一部分:SQL Server复制的阶梯
SQL Replication可以解决运行数据库驱动的应用程序中的许多问题。 发布/订阅者模型不是很容易理解,脚本和监视复制系统的复杂性需要一些思考。 最后,这是一系列文章,它们负责制作所有类型的SQL Server Replication的无术语方法。
第1级:SQL Server复制简介
主要条目:代表
发音:\?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开始是有意义的。 此处显示的示例屏幕截图是在单个服务器(WIN2008A)上安装的,其中安装了SQL-Server实例(R2A)。 此实例是SQL-Server 2008R2实例。 但是,您也可以按照SQL Server 2008和2005上的示例进行操作。
设置分发
分发服务器是事务复制的核心。 在设置所有其他组件时需要它可用,因此需要先进行配置。
首先打开SSMS并连接到包含复制源数据的SQL-Server实例。 虽然分发服务器可以位于自己的SQL服务器实例上,但在许多情况下,让发布者和分发者在同一台机器上运行是有意义的,这将在本示例中假设。
连接到服务器后,右键单击服务器下的“Replication”文件夹,然后选择“Configure Distribution ...”,如图1所示。
图1:配置分发
配置分发向导将通过其启动屏幕向您致意,如图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(,) PRIMARY KEY,
Data INT CONSTRAINT Test_Data_Dflt DEFAULT CHECKSUM(NEWID())
); GO
INSERT INTO dbo.Test DEFAULT VALUES;
GO
USE 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() 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复制简介的更多相关文章
- 201771010134杨其菊《面向对象程序设计(java)》第十六周学习总结
第十六周学习总结 第一部分:理论知识 1. 程序是一段静态的代码,它是应用程序执行的蓝本.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程.操作系统为每个进程分配一段独立的内 ...
- 20155317 十六周second 取值
20155317 十六周second 取值 题目如下图: secondset #define base 0xFFFFC0000 # #define &clock void setsecond( ...
- 20145302张薇《Java程序设计》第十六周课程总结
20145302 <Java程序设计>第十六周课程总结 实验报告链接汇总 实验一 Java开发环境的熟悉 实验二 Java面向对象程序设计 实验三 敏捷开发与XP实践 实验四 Andoid ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十六周
java学习第十六周-并发 本周,学习了Java中线程,并发的知识,在老师的带领下,进行了对知识的理解学习,以及对实验的运行讲解,对这一块内容掌握的还可以,在自主编程中,也能够完成.线, ...
- 201871010123-吴丽丽 《面向对象程序设计(Java)》第十六周学习总结
201871010123-吴丽丽 <面向对象程序设计(Java)>第十六周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201271050130-滕江南-《面向对象程序设计(java)》第十六周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十六周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十六周学习总结
学号-姓名<面向对象程序设计(java)>第十六周学习总结 实验十四 应用程序归档与线程初步 实验时间 2019-12-12 第一部分:理论知识总结 1.程序与进程的概念 ‐程序是一段静 ...
- 第十六周博客作业 <西北师范大学| 周安伟>
第十六周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10980707 ...
- 201871010104-陈园园《面向对象程序设计(java)》第十六周学习总结
201871010104-陈园园<面向对象程序设计(java)>第十六周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
随机推荐
- leecode第二百三十五题(二叉搜索树的最近公共祖先)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- CF Manthan, Codefest 16 B. A Trivial Problem
数学技巧真有趣,看出规律就很简单了 wa 题意:给出数k 输出所有阶乘尾数有k个0的数 这题来来回回看了两三遍, 想的方法总觉得会T 后来想想 阶乘 emmm 1*2*3*4*5*6*7*8*9 ...
- Project Euler 75: Singular integer right triangles
题目链接 思路: 勾股数组,又称毕达格拉斯三元组. 公式:a = s*t b = (s^2 - t^2) / 2 c = (s^2 + t^2) / 2 s > t >=1 且为互质的奇数 ...
- java mvn:安装jar包
mvn install:install-file -Dfile=fastdfs-client-java-1.27-SNAPSHOT.jar(路径) -DgroupId=org.csource -Dar ...
- 方差分析 | ANOVA | 原理 | R代码 | 进阶 | one way and two way
原理 比较两组就用t-test,比较三组及以上就用ANOVA.注意:我们默认说的都是one way ANOVA,也就是对group的分类标准只有一个,比如case和control(ABCD多组),tw ...
- Android系统下app测试功能点
一.安装卸载 1.验证app能否正常的安装启动运行,安装后的文件夹及文件是否写到了指定的目录里,卸载后相关文件是否清除 2.软件安装/卸载过程中意外情况的处理是否符合需求(如死机,重启,断电) 3.安 ...
- 集合基本操作 Python DAY2
集合本身具有两个特性 1.去重 2.关系测试 列表转集合的两种写法: list_1=[1,2,3,4,1,2,7,8,] list_1=set(list_1) #方法二 list_2=set([1, ...
- vue项目中使用插件将字符串装化为格式化的json数据(可伸缩)
插件地址:https://www.npmjs.com/package/vue-json-viewer 第一步:安装vue-json-viewer插件 $ npm install vue-json-vi ...
- json处理+list.sort()排序
#coding:utf-8 """ json是一种轻量级数据交换格式,可以对复杂数据进行表达和存储 规格: 1.数据保存在键值对里 2.键值对之间由逗号分隔 3.花括号用 ...
- Kotlin 使用类似C# 的yield功能
用过c#的可能对 yield 关键字爱不释手,那么在像我这种被迫上java贼船的人,就想找到类似的功能. 我使用的是kotlin,下面的方法演示了产生一个序列的功能. val fibonacciSeq ...