Database 将数据从Oracle同步到PostgreSQL

Database 将数据从Oracle同步到PostgreSQL,database,oracle,postgresql,data-synchronization,Database,Oracle,Postgresql,Data Synchronization,我们希望将数据(插入、更新)从Oracle(11g)同步到PostgreSQL(10)。我们的做法如下: Oracle中表上的触发器从insert和update之前的序列使用nextval更新列 PostgreSQL知道最后处理的序列号,并从Oracle>lastSequenceNumberFetched获取行 我们现在有以下问题: Oracle中的会话1插入一行,写入序列号(假设为45),但Oracle中未执行提交 Oracle中的会话2插入一行,写入序列号(比如49(因为Oracle中

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

  • Oracle中表上的触发器从insert和update之前的序列使用nextval更新列
  • PostgreSQL知道最后处理的序列号,并从Oracle>lastSequenceNumberFetched获取行
我们现在有以下问题:

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

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

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

如果您对数据的同步有更多的要求,并了解其背后的原因,可能会很有用

两种环境下的密钥是否需要相同?为什么? 查看数据的是同一位消费者,他同时查看两个数据源。 为什么不使用ORM只针对一个db?为什么需要oracle和postgres

  • 如果您的表中没有删除操作,并且表不是很大,那么我建议在行级别使用Oracle System Change Number(SCN),该行由伪列
    ORA_ROWSCN
    ()返回。这是由数字表示的提交时间。默认情况下,会针对数据块跟踪SCN,但您可以启用行级别的跟踪(关键字
    rowdependencies
    )。因此,您必须使用此关键字重新创建表。在同步过程启动时,通过函数调用
    dbms\u闪回获取当前scn。获取\u system\u change\u number
    ,然后扫描所有表
    ,其中ora\u rowscn位于\u last\u scn\u值和\u current\u scn\u值之间。缺点是这个伪列没有索引,因此您将进行完整的表扫描,这对于大表来说是很慢的

  • 如果使用delete语句,则必须跟踪已删除的记录。为此,您可以使用一个具有以下列的日志表:表名称、表id、操作(插入/更新/删除)。表由基表上的触发器填充。所以,对于您的情况,当会话1提交基表中的数据时,您就有了要处理的日志表中的记录。在会话提交之前,您不会看到它。所以你描述的序列号没有问题


  • 希望有帮助。

    我也看到过类似的设置。Postgres上的应用程序主要用于报告和其他辅助任务,而主应用程序则位于Oracle上

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

    折衷的解决方案是日间增量基于序列的同步和夜间完整表拷贝的混合

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

    • Postgres fdw对于复杂的查询速度较慢,并且会给外部数据库带来额外的负载,特别是当where子句同时引用本地表和外部表时。
      如果将外部表缓存在postgres中,同样的查询将运行得更快

    • 使用序列号进行增量/差分同步-尝试了这一方法,并可用于小表,但噩梦从子关系开始,也许orm可以在这里提供帮助

    • 在我看来,理想的解决方案可能是将Oracle更改流式传输到Postgres或将更改复制到Postgres的中间过程


    我不知道该怎么做,因为我理解它需要Oracle金门应用程序(+许可证)< /P>你是否考虑过根本不复制,并使用一个使Pracle表在PASGRESs中可用的外部数据包装器?