现有两台服务器,分别是我们公司的服务器A,和其它公司的服务器B,现在那个公司的工作人员在他们的服务器B上给我们开了只读帐户,其它就再也没有任何提供了。现在我们要同步服务器B数据库中的若干张表,这些表的数据由几十万到几百万不等,而且每天都在不停的增加。现在我们要做的就是在每天晚上,保证我们数据库中的这几张表的数据与对方服务器中的这些表的数据相同。本来打算用程序跑的,但是问题是对方的这些表不仅仅是新增数据,而且还伴随着大量的修改操作,以及删除操作。所以用程序跑的话,就有点不好搞了。现在想到的一个办法就是在我们的服务器上建立一个链接服务器,然后通过这个链接服务器将两个库中的表相关连,然后通过排除,把对方库中新增的数据导到我们库中,把对方修改的数据也更新到我们的库中,同时将他们库中的被删除的数据,在我们库中也删除掉。但是这样做效率太慢,十六七张表,同步一次,要好长时间,所以想问问有没有效率更高的办法?我们的环境是:sql 2005
对方的环境是:sql 2008数据同步同步数据数据更新导数据

解决方案 »

  1.   

    链接服务器也可以,但首先需要了解数据库的表结构,看能否通过表主键,更新数据时间字段作,有了这些可以考虑增量追加。 如果不能作增量,还可以与对方协商,给每一个table 增加一个字段timestamp,应用于行版本控制,每次抽取数据,先从远程服务器上获得所有table的主键字段和timestamp字段,比较本地的数据,再根据timestamp的变化情况来判断数据是update还是insert,如果在远程服务器有,本地没有存在,说明在远程服务器已被删除,可以考虑作delete操作或update 类似is_deleted(bit)字段=1描述数据已删除。
      

  2.   


    让他们为此表增加一个删改的触发器,每次有删改,往一个表插入一条记录,有id自增字段及被改数据记录的id字段
    你们可以根据此表得知哪些数据记录是需要同步的
      

  3.   

    假如按10G左右的数据量,是需要点时间。。
    如果对方只给你只读帐号,而不配合你多一点点权限,那只能每晚都同步10G
    如果对方能稍微配合一点,那么就可以实现增量同步,估计每晚最多同步几M or 最多几十M即可
      

  4.   


    你的意思明白了,比如对方有个时间戳字段:UID,
    如果我本地不保留这个UID的话,就可以跟据主键来判断是更新还是新增。
    但是假如我想让这两个表的数据完全相同,包括UID字段内的数据,但是这样的话,我就需要每次更新本地数据的时候,把本地的UID字段内的数据也给更新掉,但这样就不能够把本地的字段设置为timestamp类型,那本地的UID用什么类型来代替较好呢?varbinary(50)还是varchar(50)?
    虽然这样做貌似没有必要,呵呵。