最近在用SQLServer做数据库同步功能,一开始发布了一些表,后面新增了一些表后,每次都是要重新启动代理生成全部快照。有时候遇到同步的表数据量比较大,经常把数据库搞卡死了。后来网上看到一个方法,可以实现每次新增同步的表,视图后,只需要生成新的表,视图的快照即可。大大缩减了生成快照的时间,也防止了数据库卡死的情况出现。
下面我们来看一下怎么操作。首先我们用正常的方法发布一个数据库。比如我这里新增了一个发布叫Ecard
假设现在只发布了一个表T_1,那么现在另一台服务器订阅后。这台发布的服务器只需要生成T_1的快照即可。
然后假设我们现在新增了一张表T_2,然后把这张表也进行同步。那么按照正常的情况,这时要重新生成快照,系统会重新将T_1、T_2都生成。这样的话就比较耗时,而且如果这2张数据量很大的话,生成快照也会比较久。
所以我们需要修改一下,实现新增T_2后,只需要生成T_2表的快照就可以了。
首先我们来查看一下需要同步的数据库的属性
USE 数据库名;
sp_helppublication;
我们可以看到,默认的immediate_sync和allow_anonymous字段的值都是1的。此时我们需要将它们同时修改成0来实现每次生成快照只生成新表、视图的即可。
use 数据库名;
EXEC sp_changepublication
@publication = '发布的名称,比如我上面截图里面的Ecard',
@property = 'allow_anonymous' ,
@value = 'false'
GO
EXEC sp_changepublication
@publication = '发布的名称,比如我上面截图里面的Ecard',
@property = 'immediate_sync' ,
@value = 'false'
GO
完成上面的语句执行后,此时我们的发布已经改变了。以后新增了表、视图、函数或者存储过程的同步,生成快照只会生成新增的这些项目。速度快了很多,耗时大大减少了。
ok
mjj通道