本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文。
复制这个词来自拉丁语中的"replicare",意味着重复。Replication describes the process of reproducing or duplicating.
Replication in SQL Server does exactly that;it reproduces or duplicates data.任何时候,你需要创建一个数据的副本,或重现该数据的变化,复制可以使用。副本可以在同一个数据库中创建,或者在一台不同的服务器上的远程位置创建。
副本可以连续不断地与源数据保持同步,或在预定的时间间隔内进行同步。复制可以是单向同步或双向同步。Replication can even be used to keep several datasets in sync with each other.
在第一篇,我会告诉你基本的复制组件,并描述他们如何工作,让你复制你的数据和数据的变化。我们还将详细介绍建立一个简单的复制示例。
复制组件
SQL Server复制包含三大组件:发布服务器、分发服务器和订阅服务器。这些组件作用于发布和订阅所定义的项目。
项目
For each SQL Server object that should be replicated, a replication article needs to be defined.每一个项目对应一个SQL Server对象,或一个对象的子集。经常用于复制的对象有表、视图和存储过程。如果需要复制对象的完整列表,可以在Books Online中查找。项目的属性决定了该项目是否包含整个对象,或者只是对象的子集。由于这些限制,可以在单个对象上创建多个项目。
发布
逻辑上属于一组的项目可以组合成一个发布。The publication has options defined that apply to all the articles in that publication.发布的一个主要选项是选择要使用的复制类型。
发布服务器
复制中让发布可用的数据库实例就是发布服务器。发布服务器监控所有项目的变更,并让所有变更信息可用于分发服务器。
分发服务器
分发服务器是用于跟踪所有订阅服务器和所有发布变更的数据库实例,确保每个订阅服务器得到每个变更的通知。大多数的变更被跟踪到一个分发数据库。分发服务器可以是一个单独的SQL Server实例,但往往分发服务运行在发布服务器上。
订阅服务器
通过订阅接收所有发布信息的数据库实例。
订阅
订阅是发布的对应内容。订阅定义哪个服务器(订阅服务器)将接收在发布中的更新。每一个订阅在一个发布和一个订阅服务器之间创建一个链接。订阅有两种类型:推送订阅和请求订阅。在推送订阅中,分发服务器直接更新订阅服务器数据库中的数据。在请求订阅中,订阅服务器定时请求分发服务器,如果出现任何新的更改,则自己更新数据。
复制类型
SQL Server中主要有三大复制类型:快照复制、合并复制和事务复制
快照复制
快照复制每次运行时会对复制的对象和数据创建一个完整的副本。它使用SQL Server's BCP将每个表的内容写到快照文件夹。快照文件夹是在配置分发时创建的一个共享文件夹。Each participant in a replication setup needs to have access to the snapshot folder.
每一次快照复制运行,一切都是从零开始重新复制,因此它具有很高的带宽和存储要求。所有其他类型的复制(默认情况下)只有在初始化设置时才使用一个复制快照,以同步所有订阅服务器。
事务复制
事务复制工作于事务的基础之上。Every committed transaction gets scanned for changes applied to replication articles.变更扫描是由日志读取器代理完成,它读取发布数据库的事务日志。如果有更改影响已发布对象的话,这些更改将记录在分发服务器上的分发数据库。从那里,他们使用他们的方式应用到订阅服务器。
事务复制允许几乎实时同步,并在发布服务器中只留下一个小印记。虽然有几个选项,允许双向数据传递,事务复制最初是设计为单向同步的。
合并复制
合并复制的设计从一开始就允许对发布服务器以及订阅服务器的数据进行修改。合并复制还允许断开连接的情况/场景,订阅服务器在白天可能无法连接。那个订阅服务器可以在晚上重新连接上后同步。如果一行记录同一时间在两个不同地方被更新,合并复制有几个内置的选项来解决这类冲突。
配置事务复制
为了创建复制,需要配置分发服务器、发布服务器和订阅服务器。复制可以使用T-SQL脚本创建和控制。然而,相关的存储过程数量超过一百多个。因此我们还是使用SSMS图形界面来操作。下面的这个例子是在同一台服务器的同一个实例(SQL2008R2)下实现的。
配置分发
分发服务器是事务复制的核心。在配置其他组件时需要它可用,因此首先要配置分发服务器。
打开SSMS连接到包含复制的源数据库的实例。分发服务器可以在源数据库实例上,很多情况下发布服务器和分发服务器在同一台机器上,本例也是这样。
在你连接到实例后,右击复制文件夹,选择"配置分发…"如图1.1所示:
图1.1 配置分发
配置分发向导显示起始页
图1.2 配置分发向导
在下一个页面(图1.3)你要选择使用此服务器作为自己的分发服务器或选择其他服务器作为分发服务器。分发服务运行的机器还会包含有分发数据库。接受默认设置,也就是使用此服务器充当自己的分发服务器,然后点击下一步(补充:如果代理服务不是自动启动,下一步会提示是否将SQL Server代理服务配置为自动启动)。
图1.3 选择分发服务器
我们来到图1.4对话框,询问快照文件夹的存储位置
图1.4 快照文件夹
快照文件夹可以是你机器或网络的任何位置。在分发服务器上为它创建一个网络共享是有意义的。本例中使用"\\USER-67NP5R8LGK\repldata"
创建快照文件夹需要授予合适的权限。目前我们不会深入到细节,给"Authenticated Users"对文件夹有写的权限(图1.5),给"Everyone"对共享有读的权限(图1.6)。更多关于这一块的安全内容会在这一系列的后面提到。
图1.5 快照文件夹授权访问
图1.6 快照共享文件夹授权访问
在你设置好共享文件夹并将网络路径键入到向导输入框,点击下一步到分发数据库
图1.7 分发数据库
在这里你可以设置分发数据库的名称,以及它的数据文件与日志文件的存储位置。保留默认设置点击下一步来到发布服务器页面
图1.8 准备发布服务器
在发布服务器页面,你准备可能的发布服务器能够使用此分发服务器。我们将配置发布服务器在同一个实例上,因此保留默认设置点击下一步
图1.9 向导操作
最后一个问题是:在向导结束时配置分发还是生成包含配置分发的步骤的脚本文件。保留默认设置点击下一步。
现在你会看到如1.10所示的将会执行的一系列操作。点击完成开启进程
图1.10 向导总结
最后,显示如图1.11所示的配置成功信息
图1.11 执行状态
新建发布
为了创建一个发布,我们首先需要有一个数据库包含一张表用于发布。执行代码1.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.1 创建发布所用的测试数据库
在SSMS对象资源管理器,打开复制文件夹,右击"本地发布",选择"新建发布"(图1.12)
图1.12 新建发布
出现图1.13所示的新建发布向导欢迎页
图1.13 新建发布向导
点击下一步,在发布数据库(图1.14)中选择刚才创建的ReplA然后点击下一步。发布类型(图1.15)选择事务发布然后点击下一步
图1.14 选择发布数据库
图1.15 发布类型
现在你可以选择这个发布的项目(图1.16)。勾选dbo.Test表然后点击下一步来到筛选表行对话框(图1.17)。筛选是一个高级主题将会在后面章节讲述,因此现在不需要做任何选择只需点击下一步
图1.16 项目
图1.17 行筛选
接下来的三个页面是处理快照代理的。第一页面(图1.18)选择"立即创建快照"然后点击下一步。在代理安全性页面(图1.19)点击安全设置按钮,然后选择"在SQL Server代理服务帐户下运行"(图1.20)
图1.18 快照计划
图1.19 代理安全性
图1.20 选择帐户
点击确定然后在代理安全性页面点击下一步。这会带到向导操作页面(图1.21)选择创建发布,点击下一步来到总结页面(图1.22)
图1.21 向导操作
图1.22 向导总结
这里你需要为发布设定一个名称。键入"MyFirstPublication",然后点击完成。最后,显示如图1.23所示的配置成功信息。
图1.23 执行状态
新建订阅
大多数情况下,订阅服务器与发布服务器是不同的机器,但是也有你想让它们在相同的实例的场景。为了让这个例子简单我们使用相同的实例。使用代码1.2创建ReplB数据库
USE MASTER;
GO
EXECUTE AS LOGIN = 'SA';
GO
CREATE DATABASE ReplB;
GO
REVERT;
GO
代码1.2 创建目标数据库
在SSMS对象资源管理器,打开复制文件夹,右击"本地订阅",选择"新建订阅"(图1.24)
图1.24 选择新建订阅
出现图1.25所示的新建订阅向导欢迎页,点击下一步
图1.25 新建订阅向导
在发布页面(图1.26)选择刚创建的发布,点击下一步。"分发代理位置"(图1.27)让你选择推送订阅还是请求订阅。保留默认设置到订阅服务器页面(图1.28)
图1.26 选择发布
图1.27 推送/请求订阅
图1.28 订阅服务器
这里你需要选择订阅服务器和订阅数据库。
下一个页面设置"分发代理安全性"(图1.29)
图1.29 分发代理安全性
点击右侧的省略号按钮,选择"在SQL Server代理服务帐户下运行"(图1.30)
图1.30 选择帐户
点击确定,然后下一步到同步计划(图1.31)。代理计划选择连续运行。下一步到初始化订阅(图1.32)。保留默认设置,立即初始化,点击下一步到向导操作(图1.33)
图1.31 同步计划
图1.32 初始化
图1.33 向导操作
和之前一样,保留默认设置(创建订阅)然后点击下一步来到总结页面(图1.34)——将会执行的系列操作。点击完成启动进程,然后等待绿色成功标记出现(图1.35)
图1.34 向导总结
图1.35 执行状态
代码1.1在数据库ReplA下创建表dbo.Test,并插入1000行记录。在初始化快照传送到订阅服务器后,你将会看到在数据库ReplB下同样有表dbo.Test,并且有1000行记录。在你配置完成后你可以执行代码1.3来验证复制把所有的数据推送到订阅服务器。你可以自己运行其他测试脚本,你可以插入、更新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
代码1.3 比较发布与订阅
总结
Objects in a database on a SQL Server instance referred to as the publisher that are marked for replication are called articles.Articles are grouped together into publications. 订阅服务器通过订阅获取发生在项目上的更新。数据流经分发服务器上的分发数据库。发布服务器、分发服务器和订阅服务器可以是同一个实例或相同/不同的机器上的单独的实例。源和目标数据库可以是相同的(如果发布服务器和订阅服务器是相同的SQL Server实例),但分发数据库必须是分开的。
第一篇 Replication:复制简介的更多相关文章
-
【译】第一篇 Replication:复制简介
本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...
-
Python 第一篇:python简介和入门
一.python简介 1.python下载地址:https://www.python.org/downloads/ Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆 ...
-
shell之路【第一篇】shell简介与入门
shell简介 1.Shell 诞生于 Unix,Unix的第一个脚本语言,是与 Unix/Linux 交互的工具,单独地学习 Shell 是没有意义的,shell使用的熟练程度反映了用户对Unix/ ...
-
Python之路【第一篇】:Python简介和入门
python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...
-
Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
-
Python之路(第一篇):Python简介和基础
一.开发简介 1.开发: 开发语言: 高级语言:python.JAVA.PHP.C#..ruby.Go-->字节码 低级语言: ...
-
(第一篇)linux简介与发展历史以及软件的安装
1.Linux操作系统基本结构介绍: 操作系统: 英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统 ...
-
Python学习【第一篇】Python简介
Python简介 Python前世今生 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编 ...
-
第一篇 Rewrite规则简介
1.Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必 ...
随机推荐
-
gitlab 创建SSH Keys 报500错
gitlab 创建SSH Keys 报500错 看了一下日志 root@322323:/home/git/gitlab/log# cat production.log Errno::ENOMEM (C ...
-
Python特殊语法--filter、map、reduce、lambda
一.filter(function, sequence) 对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple( ...
-
Javascript DOM操作实例
最近在学DOM,但是还是没有办法很好的记住API,想找些例子来练习,网上的例子将一个个DOM对象方法挨个举例,并没有集合在一起用,效果不尽人意.所以自己写一份实例,顺便巩固下学到的知识. ...
-
ThinkPHP3.2 volist嵌套循环显示原理
php页面:$fatherList = $Document->where('pid=1')->select(); foreach($fatherList as $n=> ...
-
java for循环和数组--冒泡排序、二分查找法
//100以内与7相关的数 for(int a=1;a<=100;a++){ if(a%7==0||a%10==7||a/10==7){ System.out.print(a+ ...
-
nginx的rewrite,gzip,反向代理学习笔记
rewrite模块名:ngx_http_rewrite_module默认自动被编译 指令:rewrite regex replacement [flag] regex :正则表达式,用于匹配用户请求的 ...
-
转:网卡、光纤网卡、ISCSI卡有什么区别?
网卡.光纤网卡.ISCSI卡有什么区别? 感谢: http://www.it.com.cn/f/server/063/6/241650.htm 在讨论这个问题的时候,需要先说清楚一个问题:我们知道,在 ...
-
linux安装jdk、tomcat、maven、mysql
安装SZ rz与Gcc 首先需要tomcat的jar包,打算rz上去,发现没有安装 ./configure的时候发现缺少gcc和cc 安装解决: 再次执行成功安装了sz和rz 创建软链接然后就可以使用 ...
-
虚拟化(三):vsphere套件的安装注意及使用
虚拟化(一):虚拟化及vmware产品介绍 虚拟化(二):虚拟化及vmware workstation产品使用 虚拟化(五):vsphere高可用群集与容错 vsphere套件里面基本的组件有e ...
-
8 -- 深入使用Spring -- 2...1 搜索Bean类
8.2.1 搜索Bean类 既然不再使用Spring配置文件来配置任何Bean实例,那么只能希望Spring会自动搜索某些路径下的Java类,并将这些Java类注册成Bean实例. tips:Rail ...