在实时数据库中迁移数据的查询?
Posted
技术标签:
【中文标题】在实时数据库中迁移数据的查询?【英文标题】:Queries for migrating data in live database? 【发布时间】:2009-01-16 14:16:23 【问题描述】:我正在编写代码以将数据从我们的实时 Access 数据库迁移到新的 Sql Server 数据库,该数据库具有不同的架构和重组的结构。此 Sql Server 数据库将与我们正在开发的新版本应用程序一起使用。
我一直在用 C# 编写迁移代码,调用 Sql Server 和 Access 并根据需要转换数据。我第一次迁移了一个表,该表的条目与我最近未更新的另一个表的新条目相关,并且由于找不到 SQL Server 中相应表中的记录而导致错误
因此,我的 SqlServer 生产表的数据只到 09 年 1 月 14 日,我将继续从 Access 迁移更多表。所以我想写一个更新方法,可以弄清楚Access中没有反映在Sql Server中的新东西是什么。
我目前的想法是在 SQL 端编写一个执行 SELECT Max(RunDate) FROM ProductionRuns 的查询,以在表中的该字段中为我提供最新日期。在访问端,我会编写一个查询,执行 SELECT * FROM ProductionRuns WHERE RunDate > ?,其中参数是在 SQL Server 中找到的最大日期,并在代码中执行我的翻译步骤,然后在 Sql Server 中插入新数据.
我想知道的是,我是否有正确的语法来获取该 Sql Server 表中的最新日期?有没有更好的方法来进行这种实时数据库的迁移?
编辑:我所做的是制作当前实时数据库的副本。然后我可以在不担心更改的情况下进行迁移,然后在开发期间使用它进行测试,然后我可以在新数据库和应用程序上线时迁移最新数据。
【问题讨论】:
【参考方案1】:我个人会将这个过程分为两个步骤。
-
我将在 SQLServer 中创建 Access DB 的精确副本并复制所有数据
将此临时 SQLServer 数据库中的数据复制到您的目标数据库中
这样你就可以编写一组SQL代码来完成第二步任务
或者使用SSIS
【讨论】:
听起来好像可以。然后,当新数据库上线以捕获所有以后的数据时,我必须再次执行此操作,但无论如何都需要这样做【参考方案2】:通常,当您将数据转换到将在生产中使用的新数据库时,您会关闭数据库的所有用户一段时间,然后运行迁移并打开新数据库。这可确保在进行转换时不对数据进行任何更改。当然,我也永远不会使用 c# 来做到这一点。数据迁移是一项数据库任务,应该在 SSIS(或 DTS,如果您有旧版本的 SQL Server)中完成。
如果您要转换的数据库刚刚在开发中,我会创建 Access 数据库的备份并从那里加载数据以测试数据加载过程并获取数据,以便您进行应用程序开发。然后,当需要进行真正的加载时,您只需向用户关闭真正的数据库并使用它来加载。如果您想在开发过程中保持两者同步,那么我不会这样做,但如果必须,请每晚备份文件并在早上使用您的进程加载第一件事。
【讨论】:
【参考方案3】:您可能想考虑投资像SQL Data Compare 这样的工具。
我相信它也支持访问数据库,您可以下载试用版。
【讨论】:
我同样使用过 ApexSQL Data Diff。这不是我做迁移项目的方式,但它对于解决和同步数据库之间的差异很方便。【参考方案4】:我对你的 C# 代码很满意,但由于目标数据库中的限制,它会失败,你暂时可以disable them and then enable after you copy the whole lot。
我假设您的目标数据库是全新的数据库,没有数据,并且在传输发生时未被任何人使用
【讨论】:
【参考方案5】:听起来你有两个问题:
-
您正在将数据从一个数据库迁移到另一个数据库。
您正在更改架构。
如果您在人们使用数据的同时尝试迁移数据,那么执行上述任何一项操作都会很棘手。
最简单的方法是基于数据的静态副本迁移数据,并从您捕获静态副本的那一刻起对该数据的更新进行排队。我不知道这在 Access 中有多容易,但在 SQLServer 或 Oracle 中,您可以为此使用重做日志或使用触发器的手动解决方案。穷人的做法是为所有记录已更改记录的主键的相关表创建触发器。然后在旧数据库关闭后,您可以遍历这些键并从旧数据库中获取这些记录并将它们放入新数据库中。只需复制整个记录;如果记录被删除,则将其从新数据库中删除。
您的问题因不能简单地复制数据而变得复杂,您必须对其进行转换。这意味着您可能必须关闭两个数据库并根据更改列表重新迁移记录。需要进行大量计划才能确保一切顺利,我建议您编写一个测试脚本来验证结果数据是否正确。
如果可能,我还会确保迁移代码在其中一个数据库中运行。否则,您将复制数据两次,这将严重损害性能。
【讨论】:
以上是关于在实时数据库中迁移数据的查询?的主要内容,如果未能解决你的问题,请参考以下文章