首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从Oracle同步到PostgreSQL

问将数据从Oracle同步到PostgreSQL
EN

Stack Overflow用户
提问于 2018-06-20 13:25:07
回答 3查看 3.3K关注 0票数 1

我们希望将数据(插入、更新)从Oracle (11g)同步到PostgreSQL (10)。我们的做法如下:

  • Oracle中表上的触发器在插入和更新之前从序列中用nextval更新列。
  • PostgreSQL知道最后处理的序列号,并从Oracle > lastSequenceNumberFetched获取行。

我们现在有以下问题:

  • Oracle中的会话1插入一行,序列号(假设45)是写入的,但在Oracle中不执行任何提交。
  • 在Oracle中,会话2插入一行,写入序列号(假设49 (因为Oracle中的序列可能有间隙),并在Oracle中完成提交。
  • PostgreSQL中的会话从sequenceNumber > 44 (因为lastSequenceNumberFetched为44)从lastSequenceNumberFetched获取行,并使用sequenceNumber 49获取行。这是新的lastSequenceNumberFetched。
  • Oracle中的会话1进行提交。
  • PostgreSQL中的会话从sequenceNumber > 49的Oracle中获取行。问题是,sequenceNumber 45的行从未被取走。

对于我们的用例,是否有更好的方法来避免数据丢失的问题?

EN

回答 3

Stack Overflow用户

发布于 2018-06-20 13:54:02

  1. 如果您的表中没有delete操作,而且表不是很大,那么我建议在行级别上使用(SCN),它由伪列ORA_ROWSCN (链接)返回。这是按编号表示的提交时间。默认情况下,会跟踪数据块的SCN,但可以在行级别(关键字rowdependencies)上启用跟踪。因此,您必须用这个关键字重新创建您的表。在同步过程启动时,通过函数调用dbms_flashback.get_system_change_number获取当前scn,然后扫描所有表where ora_rowscn between _last_scn_value_ and _current_scn_value_。缺点是这个伪列没有索引,所以您将进行完整的表扫描,这对于大表来说是缓慢的。
  2. 如果使用delete语句,则必须跟踪已删除的记录。为此,您可以使用一个具有以下列的日志表: table_name、table_id_value、操作(insert/update/delete)。表由基表上的触发器填充。因此,对于您的情况,当会话1提交基表中的数据时,您需要处理日志表中的记录。在会话提交之前你不会看到它。所以你所描述的序列号没有问题。

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2018-06-20 13:42:56

这纯粹是一个数据项目,还是您这里有客户端。如果您有一个中间层,您可以使用ORM抽象其中的一些内容,并对两者进行写入。你关心这些序列是否相同吗?可以做一些事情,比如收集所有数据来同步,因为一个特定的时间戳(每个表都必须有一个UTC时间戳),然后对所有数据进行散列,并与Postgres中的数据进行比较。

如果有更多的数据同步要求,以及在此背后的推理,这可能是有用的。

对于这两种环境,键需要相同吗?为什么?谁看的数据,是同一个消费者看这两个来源。为什么不使用ORM只针对一个db,为什么需要oracle和postgres?

票数 0
EN

Stack Overflow用户

发布于 2019-07-03 22:45:50

我也见过类似的设置。Postgres上的应用程序主要用于报告和其他次要任务,而主应用程序则在Oracle上。

为了方便起见,一些主要的应用程序表被缓存在Postgres中。但是这种设置带来了同步问题。

折中解决方案是白天增量式基于序列的同步和一夜之间全表副本的混合。

关于这里提出的其他解决办法:

  • Postgres用于复杂查询的速度很慢,它给外接数据库增加了额外的负载,特别是在where子句同时引用本地表和外部表时。 如果将外部表缓存在postgres中,相同的查询将运行得更快。
  • 增量/差分同步使用序列号-tried this,并可用于小型表,但噩梦从子关系开始--也许orm在这里有所帮助。
  • 在我看来,理想的解决方案可能是将Oracle更改流到Postgres或复制Postgres更改的中间过程。

我不知道如何做到这一点,因为我知道它需要甲骨文金门应用程序(+许可证)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50949354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档