下面为您介绍一个SQL Server复制用备份文件初始化订阅的方法,该方法供您参考,如果您遇到过类似方面的问题,不妨一看。
这是一个让我觉得头疼的blog记录,弄了半天我还是很晕,其实也许结果就是我折腾的那个样子,但我折腾出来的结果感觉实在是觉得有点麻烦。默认创建的订阅都是用快照初始化的,但是也可以不使用快照来初始化订阅,而使用数据库备份来初始化。至于原因msdn有如下描述对使用这种初使化的方式:
在某些方案中,例如涉及大型初始数据集的方案中,***用其他方法初始化订阅。初始化订阅服务器的其他方法包括:
指定备份。还原订阅服务器上的备份,然后分发代理将SQL Server复制任何所需的复制元数据和系统过程。使用备份进行初始化是向订阅服务器传递数据最快的方法,而且也很方便,因为如果在启用发布以使用备份进行初始化之后取得备份,则可以使用任何最近的备份。
我的理解就是当在SQL Server复制中,有需要初始化大型的订阅数据库的时候,就不要使用快照模式让发布数据库来自动初始化订阅数据库的数据和架构,用备份还原的方法,先将发布数据库还原到订阅服务器上,然后再进行事务复制这样就只复制增量,而不用快照进行初始化SQL Server复制了。但是使用这种复制让人觉得有个麻烦的地方,就是当发布数据库的架构发生了改变的时候,比如多添了表或者存储过程视图等的时候,如果又想在发布中包含这些添加的新项,就都得在订阅服务器上再恢复一遍***的备份,还得在发布服务器上执一遍初始化脚本,反正觉得挺麻烦的,如果是用快照的话,对数据架构的如上的改变,只需要生成***的快照(初始化一下订阅)即可。也许是我弄的不对吧,我自己目前也不太清楚,反正我试了半天,如果想用备份初始化订阅就得主要步骤就得按如下的执行:
- exec sp_addsubscription
- @publication = N'publicationname',
- @subscriber ='computername\sqlserverinstancename',
- @destination_db = N'subscription_database_name',
- @subscription_type = N'Push',
- @sync_type = N'initialize with backup',
- @article = N'all',
- @update_mode = N'read only',
- @subscriber_type = 0,
- @backupdevicetype='disk',
- @backupdevicename='g:\reptest\t.bak(backupfilepath)',
- @frequency_type = 1
1,先在发布属性中的订阅选项中,更改允许从备份文件初始化,默认的是不允许。(创建好发布修改即可,以后不用执行)
2,对发布数据库备份,然后在订阅服务器上恢复这个备份
3,在发布数据库中执行如下的脚本,具体参数参见联机文档关于存储过程sp_addsubscription的说明(每执行一次第2步,也就是每次新备份了一次发布数据库并在订阅服务器上恢复了它,就要执行一次这个脚本,依我的测试如果不执行如下的脚本,只进行了备份恢复,再运行订阅的时候就会出错,当然这也可能跟具体的情况有关),用备份文件进行初始化的订阅只能使用如下脚本来创建跟初始化:
如果是***次运行这个脚本,执行完之后创建的订阅是运行在sqlserver agent的启动账户下的,如果有必要需要修改成相应的代理运行账户来执行订阅同步。
另外整个初始化过程可参见sqlserver联机丛书
How to: Initialize a Transactional Subscriber from a Backup (Replication Transact-SQL Programming)
初始化事务订阅(不使用快照)
【编辑推荐】