我继承了一个非常像 Rube Goldberg 设备的报告结构。我有一组 MS Access 2003 数据库,我已经开始迁移到 SQL Server。我目前的挂断是我们有一个 VPN/ODBC 连接到属于外部实体的 Oracle 数据库,而这个托管服务的服务器在 2000 多英里之外。虽然 Access“解决方案”确实“有效”,但速度极慢,而且任何类型的开发都是困难且耗时的。
我们决定在我们的本地站点为所有报告和分析服务创建一个镜像数据库,并且我们能够使用 Microsoft 的 Oracle 迁移工具将大部分数据传输到我们本地的“镜像”数据库。不幸的是,这个工具似乎没有提供执行增量的功能。
我已经能够使用 MS Access 和 Flyspeed SQL Query 等应用程序查询远程数据库,但它们有其局限性。例如,Access 2003 在将数据推送到本地 SQL 数据库时遇到很多问题。它可以处理非常小的数据集,但超过几千行就会卡住。Flyspeed 可以看到所有的数据集,但我出于某种原因无法执行“INSERT INTO”查询,而且很容易超时。它还缺乏根据我可以收集的内容安排查询的能力,而且我看不到它可以编写脚本。
有没有一种方法可以通过 VPN / ODBC 约束以及 SQL Server / Oracle 差异来执行增量?
谢谢,
内特
在将数据导入 SQL Server 数据库方面,您可以通过“链接服务器”功能直接使用该 ODBC 连接(请参阅http://msdn.microsoft.com/en-us/library/ms188279.aspx)-这将允许您将数据直接从删除的 Oracle 实例向下传输到本地 SQL Server,其中的语句就像
INSERT <localtable> SELECT <stuff> FROM <server>.<database>.<schema>.<table> WHERE <condition>
. 我用它从本地和远程数据库(通过 VPN 或其他隧道)提取数据,发现只要站点之间的连接可靠,它就是可靠的。值得确保您的 VPN 或 ODBC 设置正在执行流压缩:这会稍微增加延迟,但会大大缩短传输时间,因为您的数据很可能是完全可压缩的。仅拉下更改将在很大程度上取决于数据库设计。
最好的情况是,如果所有内容都经过审核,那么您可以轻松地知道自上次选择更改以来发生了哪些更新:检查当前的“上次审核的操作”,下拉在该操作和上次记录的操作之间添加/更改的行时间,将这些行合并到您的本地表中,然后记录下一次审计的最后一次操作的 ID/时间戳。在开始时只检查一次审计 ID/标记而不是对每个表检查一次的原因是为了帮助保持一致性:您最后传输的表中的最新数据不会比您首先检查的表中的数据更多。当然可以使用任何其他审计/历史记录格式(包含“最后修改日期”等的记录)。
如果数据没有像这样明显的审计结构,那么事情会变得更加复杂——比较两个站点之间大表中的数据不会非常有效。您可以通过从每个表中提取主键列和所有其他列的散列来减少传输的数据量,将散列与本地生成的散列进行比较,然后请求不在本地查看的行。你仍然会为每个人转移一些东西行在这里(对于一个 UUID PK 和一个 36 字节/行的 SHA1 散列加上任何填充,如果以二进制形式传输,它不太可能被轻易压缩,所以 VPN 可以通过这种方式加速它)并且如果表包含平均比散列的长度更细的行你应该转移很多,因为你最终会加倍(或更糟)初始散列的转移。
您可能会发现,如果您的某些数据经过审计而某些数据未经过审计,您可能会发现必须混合使用多种技术(来自审计的更新、无审计的宽表的校验和、无审计的薄表的简单完整传输)。
您可能可以考虑的另一种选择(尽管它需要另一端的合作才能实施,并且可能会产生成本影响,因为您需要本地 Oracle 许可证)是使用 Oracle 的等效 SQL Server 日志传送方法来保留副本在本地 Oracle 实例上保持最新(如果这是一个明确的要求,而不仅仅是为了方便,则将数据从那里移动到 SQL Server 或 Access,因为这是您已经在本地安装的)。这不太可能对你来说是额外的,因为它可能会干扰数据库的主要备份策略,但如果日志传送等效(或差异备份)已经用于数据库的备份计划,那么也许你可以“小猪”背部” 通过将日志或差异备份以及备份基础架构发送给您来进行安排。通过这种方式,DBMS 只处理向您推送更改(如果在给定日志段所涵盖的时间内多次更新相同的行,则可能会比其他方法推送更多,因为您将获得每个更改的日志以重播而不是只是最后的结果)。
您对上述任何一项所做的实质上是模拟复制,因此如果您对基础设施有任何发言权或复制已经在使用中,那么使用它也可能是一种选择。