天天看点

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

<a href="#_labelContents">本文所涉及的内容(Contents)</a>

<a href="#_labelContexts">背景(Contexts)</a>

<a href="#_labelProcess">搭建过程(Process)</a>

<a href="#_labelAttention">注意事项(Attention)</a>

<a href="#_labelQuestions">疑问(Questions)</a>

<a href="#_labelReferences">参考文献(References)</a>

  当SQL Server遇到同样需要对历史数据库搭建复制,通常的做法是在本地发布快照,再由订阅传输数据,那SQL Server应该如何实现备份历史数据搭建复制(发布/订阅)呢?下图是备份文件初始化订阅的基本逻辑结构图:

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure0:备份文件初始化订阅逻辑结构图)

(一) 环境信息

系统环境:Windows Server 2008 + SQL Server 2008

发布服务器:192.168.1.105,服务器名称:QuZhoushiwei105

分发服务器:与发布服务器同一台机器

订阅服务器:192.168.1.106,服务器名称:QuZhoushiwei106

发布数据库:Barfoo.TestPublish

订阅数据库:Barfoo.TestSubscribe

数据库帐号:ReplicationUser/ ReplicationPassword

(二) 搭建步骤

1) 在发布服务器上以QuZhoushiwei105服务器名称登陆发布服务器,如果你以localhost或者IP形式登陆服务器,在创建发布的时候会出现下图Figure1的错误信息;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure1:错误信息)

登陆服务器之后使用下面的SQL脚本创建一个测试数据库:Barfoo.TestPublish,创建一个测试表:UserInfo,并插入一条数据,用于模拟历史数据;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure2:UserInfo表记录)

2) 在发布数据库和订阅服务器上分别执行下面的SQL脚本创建帐号和密码(ReplicationUser/ ReplicationPassword);

3) 在发布服务器上创建一个发布,具体步骤如下图所示:

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure3:新建发布)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure4:选择数据Barfoo.TestPublish)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure5:选择事务发布)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure6:选择需要发布的字段)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure7:不勾选)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure8:设置快照代理)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure9:设置代理安全性)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure10:设置日志读取器代理)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure11:设置帐号密码)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure12:创建发布)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure13:发布名称)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure14:创建成功)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure15:创建的发布)

4) 设置发布属性中的订阅选项,把允许从备份文件初始化的默认值false设置为true;也可以使用下面的SQL脚本进行修改;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure16:Allow initialization from backup files)

5) 使用下面的SQL脚本备份数据库Barfoo.TestPublish,保留备份文件,在后面创建订阅的时候需要用到;

6) 在订阅服务器:192.168.1.106上使用下面的SQL脚本还原刚刚的备份文件;

7) 在订阅服务器行修改帐号ReplicationUser,SQL脚本如下:

8) 在发布服务器上执行sp_addsubscription存储过程添加订阅,SQL脚本如下:

如果上面的SQL脚本执行成功,数据库会返回下面的提示信息:

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure17:创建订阅返回信息)

注意:如果备份文件之后相隔太长时间,执行上面的脚本有可能会出现下面的错误信息,如果遇到这个问题,可以参考下面【疑问】的内容:

消息21397,级别16,状态1,过程sp_MSaddautonosyncsubscription,第271 行

对从指定备份创建的非同步订阅进行同步时需要一些事务,但这些事务在分发服务器上不可用。请使用更新的日志以及差异或完整数据库备份再试此操作。

9) 检查新添加的订阅属性中的安全性-&gt;订阅服务器连接,确认正确的帐号和密码,默认是使用代理帐号;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure18:订阅服务器属性)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure19:设置安全性)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure20:设置登录名密码)

也可以通过下面的SQL脚本设置订阅服务器连接的帐号密码:

10) 检查发布服务器和订阅服务器的订阅状态;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure21:启动复制监视器)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure22:订阅状态)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure23:订阅服务器的本地订阅)

11) 查看订阅服务器QuZhoushiwei106的数据库Barfoo.TestSubscribe的UserInfo表的数据;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure24:UserInfo表数据)

12) 使用下面的SQL脚本在发布服务器上UserInfo表插入新数据,测试复制,分别查看发布服务器与订阅服务器的数据;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure25:发布服务器上UserInfo表数据)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure26:订阅服务器上UserInfo表数据)

1. 在SQL SERVER下实现发布服务器和订阅服务器的通信正常(即可以互访),打开1433端口,在防火墙中设置入站规则;

2. 发布服务器与订阅服务器的SQL Server Agent代理帐号必须设置的一样,否则不能互访;

3. 后期添加新的表需要手动在订阅服务器创建表结构,主要先在发布属性的项目中勾选新表,再通过表的右键菜单创建表结构脚本。

(一) 怎么确保在发布服务器持续进数据的情况下,如何保证在拷贝历史数据备份之后还能知道订阅从哪个LSN开始读取?

解答:如果备份文件之后相隔太长时间,执行上面的脚本有可能会出现下面的错误信息:

如果遇到这个问题,有3种解决办法:

A. 按照上面的提示,对Barfoo.TestPublish数据库做一个差异备份,再在Barfoo.TestSubscribe数据库做差异还原,需要注意的是在使用sp_addsubscription的时候应该指定差异备份的文件;

B. 如果你的数据库Barfoo.TestPublish可以接受短时间不写入数据,可以在做完整备份之前就先设置数据库为只读状态,在数据库【属性】-【选项】-【状态】-【数据库为只读】设置为True;

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure27:数据库只读)

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure28:分发清除)

(二) 如果是transactional的replication,创建完毕之后是会产生对应的三个Job,下面3个是复制作业中的Job,他们的作用分别是什么呢?

A. QUZHOUSHIWEI105-Barfoo.TestPublish-12

B. QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-12

C. QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-QUZHOUSHIWEI106-22

QUZHOUSHIWEI105-Barfoo.TestPublish-12,这是REPL-LogReader类别的JOB,一个数据库只会有一个日志读取器作业,命名的格式是:ServerName-DBName-Num;

QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-12,这是REPL-Snapshot类别,的JOB,一个发布(也叫做一条同步链)对应一个快照作业,命名的格式是:ServerName-DBName-PublishName-Num;

QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-QUZHOUSHIWEI106-22,这是一个REPL-Distribution类别的JOB,一个订阅对应一个分发作业,命名的格式是:ServerName-DBName-PublishName-ServerName-Num;

可以通过下面的SQL脚本查询订阅JOB和订阅属性的相关信息:

SQL Server 通过备份文件初始化复制一.本文所涉及的内容(Contents)二.背景(Contexts)三.搭建过程(Process)四.注意事项(Attention)五.疑问(Questions)六.参考文献(References)

(Figure29:订阅配置信息)

<a href="http://technet.microsoft.com/zh-cn/library/75c8c1f8-60bc-44a8-944b-d18d1f6bda11(v=sql.90)">初始化事务订阅(不使用快照)</a>

<a href="http://technet.microsoft.com/zh-cn/library/ms147834(v=sql.105)">如何从备份初始化事务订阅(复制 Transact-SQL 编程)</a>

<a href="http://technet.microsoft.com/zh-cn/library/ms151795(v=sql.110).aspx">使用快照初始化订阅</a>

<a href="http://blog.csdn.net/arrow_gx/article/details/6370134">SQL Server事务复制通过备份文件进行订阅初始化</a>

<a href="http://database.51cto.com/art/201010/230683.htm">SQL Server复制用备份文件初始化订阅</a>

<a href="http://msdn.microsoft.com/zh-cn/magazine/ms187359(SQL.90).aspx">ALTER AUTHORIZATION (Transact-SQL)</a>

<a href="http://blog.sina.com.cn/s/blog_4b05f08e01011rue.html">Server2008+SQL2008 日志读取代理器未运行 进程无法在“WIN-XXX”上执行“sp_replcmds”</a>

<a href="http://www.cnblogs.com/fygh/archive/2011/07/04/2097405.html">SQLServer Replication 常见错误</a>

<a href="http://technet.microsoft.com/zh-cn/library/ms181702.aspx">sp_addsubscription (Transact-SQL)</a>

<a href="http://technet.microsoft.com/zh-cn/library/ms188358(v=sql.110).aspx">sp_addpullsubscription_agent (Transact-SQL)</a>