2010-03-30 66 views
1

我有一个旧的数据库和一个新的数据库。旧记录最近转换为新数据库。我们所有的旧应用程序都继续指向旧数据库,但新应用程序指向新数据库。如何将一组数据与另一组数据同步?

目前旧的数据库正在更新的唯一的一个,所以全天新的数据库变得不同步。新数据库在一天内不同步是可以接受的,所以直到我们所有的应用程序都指向新的数据库,我只需要编写一个夜间cron作业就可以使其更新。

我不想清除新的数据库和运行完整的转换脚本每天晚上,因为这将减少运行时间,并会在我们这个表的审计创建一个烂摊子。

我想从旧数据库中选择所有的数据,将其转换到新的数据库结构在内存中,然后在新的数据库插入之前检查每个记录的存在。完成之后,我将选择新数据库中的所有内容,并检查它是否存在于旧数据库中,如果不删除它。

这是最简单的方法吗?

+0

只需要思考一下,但应用程序服务器(即N层数据库应用程序)是避免此类问题的解决方案之一。使用应用程序服务器时,组件具有版本,且持久层隐藏在客户端之外。 – 2010-03-30 16:32:26

回答

1

如果你的音量非常大,这种双重比较方法将会变得很笨重。如果你的音量不高,那么每晚做一个完整的更换是“更简单”的。

假设你不必担心容量,这就是数据仓库的家伙叫change data capture问题。如果您的旧数据库在记录上有时间戳记,那么您至少可以保存一半的比较结果(您仍需要查找删除记录)。如果没有,那么这里有一些其他的建议。

你可以把一个触发旧的数据库上写出来的任何更改(插入,更新,删除),旧的数据库,然后每天晚上将那些到新的数据库。

或者,您的数据库系统可能有一个日志(重做日志,事务日志等)中的每个数据库事务的记录。如果您有权访问此日志,那么您可以每天晚上查询自前一天晚上以来的事务。然后将这些事务应用到新数据库。

0

我不知道这是否是简单但肯定,在你的情况,是最安全的

如果您使用SQL2005或2008,我会在Integration Services中实现此功能。

0

我同意Paulo的说法,但取决于所有应用程序指向新数据库需要多长时间才能使用工具来执行此操作,您可以查看SQL Data Compare http://www.red-gate.com/products/SQL_Data_Compare/index.htm这是一个伟大的工具,我用它在dev/pre-prod/prod服务器之间同步数据。

0

由于旧的数据结构可以“转换”为新的数据结构,因此您有很多选择。这是一个需要考虑的问题。

创建对旧数据/表格的视图。不是将数据转换为“内存”,而是创建执行这些转换的旧数据的数据库视图。然后使用tSQL 2005和更高版本的EXCEPT子句与联合来获取所有更改。将查询结果存储在#temp表或@tableVariable中。然后执行删除,插入和/或更新。

select 'inOldOnly' as whichServer, old.* 
from OldDb.dbo.vwOldStructureTransformed as old 

EXCEPT 

select 'inOldOnly' as whichServer, new.* 
from NewDb.dbo.NewStructure as new 

UNION 

select 'inNewOnly' as whichServer, new.* 
from NewDb.dbo.NewStructure as new 

EXCEPT 

select 'inNewOnly' as whichServer, old.* 
from OldDb.dbo.vwOldStructureTransformed as old 

这种方法相当灵活。在实践中,我建议列举列(与使用*相比)。如果我们知道有关旧数据库和新数据库大小的更多详细信息,我们可以对WHERE子句中的行过滤是否有任何好处发表评论。

相关问题