由于公司发展的需要,要在地球的另一边放一台服务器。
把公司现有的网站(asp.net做的)和数据库(sqlserver)拷贝一份过去。
要求两边的数据库数据能及时同步更新。
由于所跨越的地域很大,两边的互访速度非常缓慢,我们尝试了,做数据库分发同步和做触发器同步均因访问速度过慢而告败。
现在我们想尝试另外一个方案来实现这个同步问题,做一个数据库修改记录表,把每次数据库更改记录到一个表里,然后根据这个表的状态来对另一边的数据库进行相同的更改。但是这个有遇到了一个问题,由于我们的表主键用的都是自增长的标识符。这样一来两边的表主键就会产生误差
现在思考很久仍然找不到比较好的方法来解决这个跨国大区域的数据同步问题了。
请有这方面经验的高手支支招,谢谢!!!

解决方案 »

  1.   

    有些时候用自增主键,会带来一些问题,可以考虑用guid.
    同步的问题,现在我还只会通过ssis,或者是订阅数据库.
    这样的方案还真没有用做过...帮你顶.呵呵
      

  2.   

    最奔方法:增加一个索引的GUID,用于判断
      

  3.   

    如果你的问题只是“表主键用的都是自增长的标识符。这样一来两边的表主键就会产生误差 ”的问题的话,实际上所谓的自增字段完全可以写入数据值的。我有许多年不用SQL Server了,我的机器上的SQL Server都被我卸载了,无法尝试。但是我可以肯定(因为我有曾经实际商品化的产品就是那样做的),自增字段可以写。是否需要发送一条set语句给SQL Server我忘记了,似乎不需要。如果目标数据库中有同样值的记录,先删除了它,然后写入记录,包括这个自增字段的值也是写入而不是让数据库自动产生值。
      

  4.   

    如果在两边的服务器都分别由各自本地业务程序插入数据,那么你可以为远程的数据库的那个“自增字段”设置一个较高的下限值,例如:DBCC CHECKIDENT ('dbo.Person', RESEED, 99999999999999) 
      

  5.   

    实际上,最好的方法是SOA的做法,即忽略关系数据库的那些比较低级的概念。远程的服务器,提供一个api(例如使用web service开发),你可以使用这个api服务在本地的代理产生一组对象,例如一个订单对象:public class 订单
    {
        public 订单明细[] _Items;
     .....
    }调用这个服务方法将一组聚合了明细对象的订单对象发送到对方,对方自己在放入数据库。基于对象实体进行编程,忽略“自增长字段”这种东西。实际上,订单保存到对方服务器上其“自增长字段”可以跟在本地是不一样的。这就要求你们不要用“自增长字段”作为业务逻辑对象的有意义的值,而仅仅是作为一个没有任何业务逻辑意义的随机数来设计。
      

  6.   

    我来说一个与LZ的问题不相关的事(对数据库的订阅与分发我一窍不通)。可不可以这样做?
    :
    找个第三方,把数据通过第三方周转,第三方必须满足一个条件:A和B访问C的速度都非常快。
      

  7.   

    ---------------------------------------------------------------------------------
    SOA方面我了解还是很多。
    这就要求你们不要用“自增长字段”作为业务逻辑对象的有意义的值,而仅仅是作为一个没有任何业务逻辑意义的随机数来设计。
    ---------------------------------------------------------------------------------
    程序里大范围用了 “自增长字段” ,要取消作为业务逻辑对象的有意义的值,貌似很不值得。。
      

  8.   

    上面少了一个“不”字,呵呵
    --------------------------------------------------------------------------------- 
    SOA方面我了解还“不”是很多。
      

  9.   


    嗯,应该说,这种设计bug犯了一次不应该再犯第二次。一个业务逻辑值,怎么可能使用编程技术来决定呢。例如发票的流水号,也许认为它真好契合所谓“自增长字段”的概念(暂不考虑所谓自增张字段其实在多用户情况下是不连续的,会留下空号)。然而,实际业务中,难道不可能为一张发票重新编写流水号?这有实际的业务意义,结果程序设计造成业务需求(修改编号)根本不能实现,此时就可以看出最初的设计思路是本末倒置了。这种设计问题第一次开发复杂业务系统的人会犯,但是不应该犯第二次。这种系统的设计问题实在是出在关键环节上,轻易躲不过去,还不如早点重新设计软件。
      

  10.   


    时代太久远,我忘记了SQL Server的具体写法。自己google相关做法吧。参考:http://www.google.cn/search?hl=zh-CN&newwindow=1&rls=com.microsoft%3A*%3AIE-SearchBox&rlz=1I7GGIJ&q=sql+server+IDENTITY_INSERT&btnG=Google+%E6%90%9C%E7%B4%A2&meta=lr%3Dlang_zh-CN%7Clang_zh-TW&aq=f&oq=
      

  11.   

    学习了..
       长点见识.
      不过我觉得用web service倒是可以尝试看.数据库同步速度按你们的情况是达到那样的效果.
      

  12.   

    用SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }可以解决自增字段插入的问题。
      

  13.   


    如果自己设计数据同步机制,肯定是要有检查机制的。只要保证“事务”是完整的(ACID我就不重复了),那么这种检查只要比较“粗”的粒度就可以,例如只要调用对方的api来取得某段时间内传递到对方的所有发票号的一个(CRC、MD5之类的)验证码,最终定位到一小段时间的数据重新传递。“2M带宽”这是指对终端而言。就好像说ADSL速度不快,是指单个ADSL路由器而言(实际上上行速度低很多),而你可以另外装一个ADSL。
      

  14.   

    用数据库的DTS功能完全可以实现。
      

  15.   

    sql2005里面用数据库镜像等同步技术可以解决
      

  16.   

    DTS已经落伍了,现在使用IS最方便也最简单!我们公司用的就是这种方式,每天从国外的服务器上备份或同步数据,可以方便的的使数据库同步以及数据的导入导出和转换!建议楼主研究一下!