SQL Server 复制(Replication) ——事务复制搭建
本文演示如何搭建最基本的事务复制。
环境准备:
虚拟机2台:
服务器名分别为RepA和RepB,RepA为发布服务器,RepB为订阅服务器。均安装WindowsServer 2008R2英文版(在外企工作的原因)。并确保两台服务器能互访。
SQL Server:
在上面的虚拟机中分别安装SQLServer 2008 R2 x64 英文企业版。
演示数据库:
微软示例数据库AdventureWorks2008 R2
配置事务复制
复制的配置可以使用T-SQL来实现,但是所需的T-SQL及存储过程加起来可能上百个,所以这里以SSMS操作来演示。
事务复制的配置需要对发布服务器、分发服务器和订阅服务器都进行配置。本例使用发布和分发服务器均在一个实例上的情景:
下面是拓扑图:
步骤一:检查数据库是否已经参与了复制环节,这一步为了保证避免重复对一个数据库进行复制配置:
- USE master
- go
- SELECT name ,
- CASEis_published
- WHEN0 THEN N'未发布'
- ELSE N'已发布'
- END N'是否发布' ,
- CASEis_subscribed
- WHEN0 THEN N'未订阅'
- ELSE N'已订阅'
- END N'是否订阅'
- FROM sys.databases
- WHERE name = 'AdventureWorks2008R2'
步骤二:配置分发服务器:
分发服务器是事务复制的核心。其他组件的运行都必须以分发服务器的可用为前提。所以是首要配置项。首先登录SSMS,这里是RepA。然后右键下图:
这是实例级别的配置,可以单独在独立的实例上配置,但是为了成本考虑,很多实际环境都不会这样用,所以我也把分发和发布部署在同一个实例上。配置步骤很简单:
步骤2.1:配置分发向导:
这步直接跳过也是没有问题的,简单说一下,如果选择了分发发布同一实例,则选择上面的选项,如果是独立的分发实例,就选择下面的选项。由于本例使用分发与发布相同实例,所以这里点击下一步。
步骤2.2:配置分发代理:
从
描述中得知,用于配置SQLServeragent是否在机器启动后自动运行,作为正式应用,这里几乎没有理由选择手动启动,所以直接下一步。大家是否好
奇为什么这里就有一个可点击的【Finish】?因为微软系列的产品大部分都已经比较自动化,所以实际上都已经默认了一些配置,读者可以直接点
【Finish】看结果,如果没有进一步的配置,SQLServer会默认使用下面的路径来存放分发数据:
我们先回到上一步。
步骤2.3.快照文件夹:
前
面一文说过,所有类型的复制都以快照为基础,事务复制中的快照用于初始化之用,所以所有的复制类型都要配置快照文件夹,每次初始化,复制会把发布服务器中
配置为发布项的数据进行快照,然后存放到这个文件夹中,根据pull还是push模式,再进行对这个文件夹数据的处理。
需要说明的是这里是【共享文件夹】,由于订阅服务器需要从这个文件夹读取数据,所以这个文件夹最起码要让复制所涉及的账号有读的权限,对于发布服务器,还需要有写的权限。
这
个快照文件夹可以是本机的任意路径或者网络路径,通常来说,这个路径应该创建在分发服务器上的网络共享盘,本例中就是在发布服务器上。比如使用下面截图中
的路径,然后赋予合适的权限。在例子中,我使用在C盘下创建一个叫做ReplicationSnaeshotFolder的文件夹,然后赋权,这里创建一
个叫做【授权用户】(AuthenticatedUsers)的用户组,然后赋予写的权限,添加【Everyone】,授予读的权限。
然后我们用这里的路径作为快照的共享文件夹路径:
步骤2.4.配置分发数据库:
这一步主要是配置分发数据库存放在哪个地方,由于演示环境的限制,都放在C盘,如果可以,建议独立分开,最起码不要放在C盘,系统盘,你懂的。
步骤2.5:配置发布者(发布服务器):
这里可以配置分发者使用的账号密码,及其他混合项,Impersonatethe agent process account是指用sqlagent的账号作为连接发布者的账号。
另外,还可以在这里指定是SQLServer的发布还是oracle的发布。
步骤2.6:配置完成
这里可以选择直接配置或者只生成脚本,建议两者都选择,这样一旦有问题,脚本还是可以很快重建。最后点【完成】,让SQLServer自己去配置。
最后可以看到系统数据库文件夹下出现了新数据库:
步骤三:配置发布
3.1. 发布(Publication):
这
是一个名词,前面提到过,是一组项目(articles)的逻辑集合,每个发布可以包含一个或多个项目。发布中的配置项会影响它包含的所有项目,通过这种
方式,可以减少管理对象所带来的影响。其中最重要的配置项就是复制类型。由于本文用微软示例数据库,所以这里不用再创建测试数据库。
3.2. 新建发布:
打开图中的部分,配置发布项:
3.3. 发布数据库:
这里是选择需要进行发布的数据库。
3.4. 复制类型:
这里我们选择单纯的事务发布,对于第三个选项,实际上就是【对等发布】,在后续文章中演示。
3.5. 选择发布对象(article)
我们随便找几个,但是这里注意,事务复制要求表上必须有主键,我随便创建了一个简单的表,没有主键,在选择的时候就能看到这种情况:
补充一下,这里选表的时候,可以指定某些列,也可以全表发布。但是即使你没勾选主键列,只要你选了表中的某些列,主键列也会被自动选上的。
3.6. 筛选表数据
上面一步是对列进行筛选,这一步是对行进行筛选,可以对已经选择的列中数据进行条件筛选,然后点下一步:
3.7. 配置快照引擎
这里可以选择在配置完毕之后马上创建快照,并在订阅初始化之前都保留这个快照,也可以选择安排特定时间运行,比如系统闲时。也可以都不勾选。很多例子上都会勾选第一项,但是本人建议全部不勾选,特别是对大数据库。这部分在后面的文章再介绍,这里只做演示。
3.8. 代理安全性
本文选择借用sqlagent来运行,出于安全性,通常会创建专用的域账号或者本地账号(非域环境)和安全的密码,这样不需要经常更改。
3.9. 完成发布:
这里和配置分发一样,可以保存脚本。
3.10. 定义发布项的名称:
这个名称是标识每个项目的名字,这里我使用FirstPublication作为发布项的名称
步骤4:配置订阅
订阅服务器实际上可以在同一台机器,不过在实践中,通常是分开服务器,所以这里也单独一台服务器,在完成发布之后,接下来就是配置订阅,接收来自发布的信息:
首先要保证两台机器能互联,另外,复制技术要求使用服务器名,如果使用IP地址或者别名,会报错,错误信息如下,所以你需要使用服务器名来登录,本例中使用RepB登录:
4.1. 配置订阅项
现在连到订阅服务器,本例使用RepB,这里的步骤基本上和配置发布项是一样的
4.2.
这里有个需要提醒的,如果两个服务器不在域中,由于DNS解析问题,可能需要修改host文件,路径在:
C:\Windows\System32\drivers\etc\host 把对方服务器的IP加进去即可:
另外防火墙等问题都是要预先处理的。
连接之后,就能看到发布项,如下图:
4.3. 选择分发代理位置
实际上就是选择订阅类型,在第一篇中已经提到它们的区别,这里选择pull模式:
4.4. 选择订阅者
实
际上就是订阅数据库,这里下拉框可以选择新库,或者现有的库,如果选择新库,而且是库比较大的时候,初始化的时候会很久,所以对于第一次部署,并且是大
库,建议先把发布库的备份还原到本地,这样就减少需要同步的数据量。由于是演示库,我这里新建一个不同名的库,库名也可以相同。
这里新建一个叫Adventureworks_Rep的库,注意图32中的红框部分,有时候复制中的报错是因为这里没有填写,如果权限要求不是很严格的话,可以填入sa。
4.5. 订阅代理安全性:
这里可以选择专用的账号,也可以使用SQLServer代理账号,为了简便,这里选择代理账号,但是对于正式环境,还是建议使用专用账号:
4.6. 同步计划
这里可以选择是连续运行还是按需运行,因为是事务复制,我们实际上是希望能尽量实时同步,如果不是,其实合并复制也行,所以我们这里选择连续运行:
初始化订阅:
可以选择马上进行初始化或者在第一次同步时初始化,这里选择马上初始化,然后点下一步
由于在配置发布时没有初始化,所以目前可以看到订阅库中没有任何表
我们只需要初始化发布项即可。
Errormessages:
· Theprocess could not execute 'sp_replcmds' on 'REPA'. (Source: MSSQL_REPL, Errornumber: MSSQL_REPL20011)
Get help: http://help/MSSQL_REPL20011
· Cannotexecute
as the database principal because the principal "dbo" doesnot exist,
this type of principal cannot be impersonated, or you do not
havepermission. (Source: MSSQLServer, Error number: 15517)
Get help: http://help/15517
The process could not execute'sp_replcmds' on 'REPA'. (Source: MSSQL_REPL, Error number: MSSQL_REPL22037)
Get help: http://help/MSSQL_REPL22037
完成后可以看到本地订阅中已经有订阅项:
在配置的过程中,我们可能会遇到各类问题,但是绝大部分问题都是可以解决的,而且很多问题都是因为一个根源导致的,比如下面的两个报错:
报错一:
英文描述:
Cannot
execute as the database principal because theprincipal "dbo" does not
exist, this type of principal cannot beimpersonated, or you do not have
permission.
中文描述:
无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。
已将数据库上下文更改为 'AdventureWorks2008'。 (Microsoft SQL Server,错误: 15517)
问题2:
SQL Server 2008 replication failing with: process couldnot execute 'sp_replcmds'
这两个问题虽然会有其他原因引起,但是通常来说是因为发布的数据库所有者未填写,此时可以查一下数据库属性->文件->所有者如果没有话,填个sa再试一次就可以。
SQL Server 复制(Replication) ——事务复制搭建的更多相关文章
- SQL SERVER 之快照复制,事务复制,合并复制
一.环境要求及说明 1.快照复制和事务复制是单向的(2005及以后的版本中加入了订阅端可更新的事务复制). 2.合并复制是双向的. 3.快照复制对表结构没有要求. 4.事务复制要求表有主键. 5.合并 ...
- SQL SERVER 数据库表同步复制 笔记
SQL SERVER 数据库表同步复制 笔记 同步复制可运行在不同版本的SQL Server服务之间 环境模拟需要两台数据库192.168.1.1(发布),192.168.1.10(订阅) 1.在发布 ...
- 【SQL Server高可用性】数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表
原文:[SQL Server高可用性]数据库复制:SQL Server 2008R2中通过数据库复制,把A表的数据复制到B表 经常在论坛中看到有人问数据同步的技术,如果只是同步少量的表,那么可以考虑使 ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- SQL Server中的事务日志管理(8/9):优化日志吞吐量
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- SQL Server中的事务日志管理(6/9):大容量日志恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志
来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...
- 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复
源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 【转】SQL Server中的事务与锁
SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂 ...
随机推荐
- 一、JSON解析与字符串化
JSON.stringify() 序列化对象.数组或原始值 语法:JSON.stringify(o,filter,indent) o,要转换成JSON的对象.数组或原始值 filter,指定要序列化的 ...
- Visual Studio使用技巧,创建自己的代码片段
1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...
- vs2013\2015-UML
1.UML简介Unified Modeling Language (UML)又称统一建模语言或标准建模语言. 简单说就是以图形方式表现模型,根据不同模型进行分类,在UML 2.0中有13种图,以下是他 ...
- Razor------引入css文件的方法
MVC3.0之前版本: <link href=@Url.Content("~/Content/Styles.css") rel="stylesheet" ...
- Maven------pom.xml自动加载各种类库代码
转载: http://lavasoft.blog.51cto.com/62575/1388866/ 一般要加<type>jar</type> <dependency> ...
- 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集 ...
- js里面setInterval和setTimeout相同点和区别
相同点:两个方法都是先触发间隔时间,再触发回调函数 区别: 1.setInterval每隔指定的时间就执行一次表达式,若不停止会一直执行下去 而setTimeout在执行时,是在载入后延迟指定时间后, ...
- Java创建数组的三种方法
■ 第一种: int[] arr=new int[6]; arr[0] = 1; arr[1] = 2 arr[2] = 3; arr[3] = 4; arr[4] = 5; arr[5] = 6; ...
- Android英文文档翻译系列(5)——VPNService
API14位于android.net.VpnService 类概述|Class OverviewVpnService is a base class for applications to ext ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...