如何实现快速数据库同步。有一个只读源?

时间:2010-10-17 20:56:03

标签: c# ado.net synchronization

我有一个源数据库(Sybase),它是只读的,您可以使用导入文件写入数据库。另一边是我自己的数据库(MSSQL),没有任何限制。

主要问题是第一个数据库上没有时间戳,我没有任何更改源数据库的权限。那么是否有一个引擎/解决方案来实现这种同步。做什么?

1 个答案:

答案 0 :(得分:1)

差异算法可能有效,但它不会很快,因为您必须扫描整个源数据库以进行每次同步。

基本上,你会以商定的,稳定的方式完成一个完整的数据提取(即两个没有变化的提取物会产生相同的输出。)

然后将其与您之前提取的数据进行比较,然后您可以找到所有更改。需要比纯文本差异更聪明的东西,以帮助确定行不仅被删除+插入,而且实际上已更新。

不幸的是,如果没有办法向源数据库询问最新的更改是什么,正如您所指出的那样,缺少时间戳或类似的机制,那么我看不出你怎么能更好而不是每次完整的提取物。

现在,我不太了解Sybase,但在MS SQL Server中,您可能会创建另一个镜像第一个数据库的数据库,在第二个数据库中,您可以进行所需的任何更改。

但是,如果您可以在Sybase中创建这样的数据库,并使用SQL同时访问这两个数据库,那么您可以运行产生差异的查询。

例如,有些内容如下:

SELECT S.*
FROM sourcedb..sourcetable1 AS S
    FULL JOIN clonedb..sourcetable1 AS C
    ON S.pkvalue = C.pkvalue
WHERE S.pkvalue IS NULL OR C.pkvalue IS NULL

这将生成插入或删除的行。

要查找那些已更改的内容,您需要此WHERE子句:

WHERE S.column1 <> C.column1
   OR S.column2 <> C.column2
   OR ....

由于表是连接的,WHERE子句将过滤掉前一个提取和当前状态不同的任何行。

现在,这可能也不会快速运行,您必须进行测试才能确保。