我有一个源数据库(Sybase),它是只读的,您可以使用导入文件写入数据库。另一面是我自己的数据库(MSSQL),它没有任何限制。如何实现快速数据库同步。只读源?
主要问题是第一个数据库上没有时间戳,我没有任何访问权限来更改源数据库。那么是否有引擎/解决方案来实现此同步?做了什么?
我有一个源数据库(Sybase),它是只读的,您可以使用导入文件写入数据库。另一面是我自己的数据库(MSSQL),它没有任何限制。如何实现快速数据库同步。只读源?
主要问题是第一个数据库上没有时间戳,我没有任何访问权限来更改源数据库。那么是否有引擎/解决方案来实现此同步?做了什么?
差异算法可能有效,但速度不会很快,因为您必须扫描整个源数据库才能进行每次同步。
基本上你会做了充分的数据提取物,在商定,并且稳定,方式(即。两个这样的萃取液用无改变之间会产生相同的输出。)
然后,你比较,为前面的提取物你做了,然后你可以找到所有的变化。比纯文本差异稍微聪明一些的东西是需要的,以帮助确定行不仅仅是删除+插入,而是实际更新。
不幸的是,如果没有办法问源数据库最新的变化是什么,如您所指出的那样,缺乏时间戳或类似的机制,那么我看不到如何获得比每次完整的提取都要好。
现在,我不太了解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子句会过滤掉任何行,其中前面的提取物和目前的状态是不同的。
现在,这可能不会跑得很快,你必须测试以确保。
感谢您的回答。主要问题是我无法使用SQL - 我必须使用ADO.NET。所以我必须从双方加载所有数据,获取更改并更新目的地。 – 2010-10-20 09:15:27
两台服务器的数据是否改变?或者你只是想将所有内容都镜像到只读数据库中? – 2010-10-20 11:46:53
是和否;-) 源数据库是只读的,目的地是我的数据库。 源数据库的更改必须位于目标数据库中。来自目标数据库的更改将作为文本文件导入到源数据库中。所以如果你只看到没有文本文件的任务 - 是的,它只是一面镜子。 – 2010-10-21 06:45:18