我有一个旧数据库和一个新数据库。旧记录最近被转换为新数据库。我们所有的旧应用程序都继续指向旧数据库,但新应用程序指向新数据库。
目前,旧数据库是唯一一个正在更新的数据库,因此新数据库全天都不同步。新数据库在一天内不同步是可以接受的,所以在我们所有应用程序都指向新数据库之前,我只需要编写一个夜间cron作业来使其更新。
我不想每晚清除新数据库并运行完整的转换脚本,因为这会减少正常运行时间,并且会在审核该表时造成混乱。
我正在考虑从旧数据库中选择所有数据,将其转换为内存中的新数据库结构,然后在将每个记录插入新数据库之前检查每个记录是否存在。完成后,我将从新数据库中选择所有内容并检查旧数据库中是否存在,如果不存在则删除它。
这是最简单的方法吗?
答案 0 :(得分:1)
如果您的音量非常高,这种方法的双重比较方法将变得难以处理。如果你没有很高的音量,那么每晚进行一次完全更换是“更简单”。
假设您确实需要担心卷,这就是数据仓库员工称之为change data capture的问题。如果您的旧数据库在记录上有时间戳,那么您至少可以节省一半的比较(您仍可能需要查找删除)。如果没有,那么这里有一些其他的建议。
您可以在旧数据库上放置一个触发器,将任何更改(插入,更新,删除)写入旧数据库,然后每晚将这些更改应用到新数据库。
或者,您的数据库系统可能有一个日志(重做日志,事务日志等),其中包含每个数据库事务的记录。如果您有权访问此日志,那么您可以每晚查询自前一晚以来的交易。然后将这些事务应用到新数据库。
答案 1 :(得分:0)
我不知道它是否是最简单的但当然,在你的情况下,最安全。
如果你使用的是SQL2005或2008,我会在Integration Services中实现它。
答案 2 :(得分:0)
我同意Paulo的观点,但是根据所有应用程序指向新数据库需要多长时间,你可以看一下使用工具执行此操作,你可以查看SQL数据比较http://www.red-gate.com/products/SQL_Data_Compare/index.htm这个是一个很棒的工具,我用它在dev / pre-prod / prod服务器之间同步数据。
答案 3 :(得分:0)
由于旧数据结构可以“转换”为新数据结构,因此您有很多选择。这是一个值得考虑的问题。
在旧数据/表上创建视图。而不是“在内存中”转换数据,而是创建执行这些转换的旧数据的数据库视图。然后使用带有union的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子句中过滤行是否有任何好处。