网站服务器基于星形结构分布,即,一台中心数据库,N台叶节点数据库,位于不同的网络,定时读取中心数据库的更新,同步到本地。用户访问读数据时就近访问叶节点数据库,写数据时只写中心数据库。
少数实时性强的需要时用户直接读中心数据库。本来想配SQL Server的发布/订阅,配了半天没有成功,提示remote_admin权限什么的不对,好像必须是域用户才行?几个数据库必须在同一个域里面?那我就没法用了。所以想手写程序来实现,具体实现:
每个表都加两个字段,记录类型(I-Insert、U-Update),时间戳(最后更新此记录的时间);
每个叶节点服务器定时(如5分钟)运行一个daemon,访问中心服务器的api,发送时间戳过去,中心api根据时间戳,取此时间戳之后的数据,xml格式返回叶节点,叶节点解析xml,写入数据库。程序已经写好了,问题是——删除的记录我怎么得到?
我想的解决方案——
方案1)不删数据,只标记,那删除就等同更新了。
方案2)用触发器写transaction log,同步时只读log,可以做到全貌恢复。但觉得太麻烦,log量也会比较大。不知实际应用中,成熟的数据同步算法是怎么解决这一问题的?

解决方案 »

  1.   

    个叶节点服务器定时(如5分钟)运行一个daemon,访问中心服务器的api,发送时间戳过去,中心api根据时间戳,取此时间戳之后的数据,xml格式返回叶节点,叶节点解析xml,写入数据库
    -----------------------------------------------------------------------------------
    這個時候同樣可以刪除本地數據庫中存在,而中心數據庫中部存在的數據啊
      

  2.   

    楼主 to yrwx001()這個時候同樣可以刪除本地數據庫中存在,而中心數據庫中部存在的數據啊
    -----------------------------------------------------------------------------------
    那需要把中心数据库中所有数据读到本地,然后再比较?
    那样是不可行的。
      

  3.   

    楼主 to yrwx001()這個時候同樣可以刪除本地數據庫中存在,而中心數據庫中部存在的數據啊
    -----------------------------------------------------------------------------------
    那需要把中心数据库中所有数据读到本地,然后再比较?
    那样是不可行的。
    -----------------------------------------------------------------------------------
    不要的delete from 本地庫.dbo.tb1 where not exists(select 1 from openrowset('SQLOLEDB','中心庫IP';'sa';'MyPass',
       'SELECT * FROM 中心庫.dbo.tb1') A where A.key = tb1.key )
      

  4.   

    delete from 本地庫.dbo.tb1 where not exists(select 1 from openrowset('SQLOLEDB','中心庫IP';'sa';'MyPass',
       'SELECT * FROM 中心庫.dbo.tb1') A where A.key = tb1.key )如果有10万行记录,更新了200行,删除了100行,您这个方法,会从网络传输10万条记录吧?
      

  5.   

    1. 使用强制订阅, 这样不存在快照文件夹共享的问题(从发布服务器将数据推向订阅者)
    2. 检查 @@SERVERNAME 和 SERVERPROPERTY(N'ServerName') 的结果是否一致, 如果不匹配, 则也会导致发布失败.
      

  6.   

    通用文件和数据库同步备份软件《同步专家网络版》数据库同步演示文件:
    http://www.datsync.net/down.asp?file=download/dat演示.rar&name=数据库同步演示
    软件下载:
    http://www.ahjoe.com/prodnet.asp
    文件同步教程:
    http://www.ahjoe.com/netdoc.htm特点:
      通过ODBC访问数据库所以可以支持绝大多数数据库类型。支持不同类型数据库之间数据同步,只要有相应数据库的ODBC驱动程序即可。可自定义需要同步的字段。可限定需要同步的记录的时间范围。可选择数据压缩传输,使得在低带宽条件下也能有较好的速度。