【问题标题】:Seeking alternatives for data replication寻找数据复制的替代方案
【发布时间】:2021-12-14 14:58:06
【问题描述】:

当前设置

SOR 是一个 Oracle 系统 报表是一个 SQL Server 系统

需要将一个相当大的表从 Oracle 复制到 SQL 框。

99% 的数据不会被修改,但会在 Oracle 表中添加新记录。 数据增量需要放入 SQL Server。

SQL Server 上的数据刷新计划在凌晨 2:00 进行。

我担心提取 12 亿条记录的全部数据所需的时间会超过窗口所允许的时间。

我折腾的一个解决方案是只提取当前月份的数据,从 SQL 框中删除前 30 天的数据,只从 Oracle 系统中提取最近 30 天的数据。

这个想法的一个巨大问题是......没有日期字段可以使用UGH

另一个想法是在SQL Server表中添加ROWID字段,并对该值进行全表扫描,如果没有找到,则添加它。如果发现更新新字段。这感觉就像是对每条记录的强力全表扫描(不理想 - IMO)

如果有人有不同的想法,我真的很想听听。

【问题讨论】:

  • Oracle 端创建一个表,以跟踪哪些记录已成功传输/更新到 SQL 端。这是在 Oracle 表中查找新记录的一种更有效的方法。

标签: sql-server oracle


【解决方案1】:

你可以探索的几件事

选项 1 - 如果您可以在 Oracle 表中添加索引

添加一个新的日期列,使其不可见,因此(接近)对现有应用程序代码的影响风险为零。注意:接近 != 零。

使列默认为 SYSDATE 以自动处理插入,并添加触发器以捕获更新。索引列的性能。如果您还需要删除,请参阅选项 2。

在刷新时,使用此列获取所有行增量并推送到 SQL Server。如果索引空间是个问题,您可以在推送数据时将列值清空,以便索引只保存未传输的数据。

重要提示:您需要仔细管理序列化,以免错过未提交的事务。一种常见的方法是锁定表,打开游标,提交释放锁,然后从游标中获取以保证完整性。其他策略稍微复杂一些,包括查看 V$TRANSACTION 上最旧的活动交易。

选项 2 - 没有索引或额外的列可能

添加插入/更新/删除触发器以捕获操作 (I,U,D) 和相关行的 rowid 或主键以及序列号,以保证将更改排序到单独的表中。 (也就是自产的物化视图日志)。

然后在刷新时,使用它以将更改应用到 Oracle 表的顺序将更改应用到远程 SQL Server 表。您仍需支付触发器成本,但无需在源表上添加额外的索引/列。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多