【发布时间】:2018-11-29 15:41:53
【问题描述】:
我们希望将数据(插入、更新)从 Oracle (11g) 同步到 PostgreSQL (10)。我们的方法如下:
- Oracle 中表的触发器在插入和更新之前使用序列中的 nextval 更新列。
- PostgreSQL 知道最后处理的序列号并从 Oracle > lastSequenceNumberFetched 获取行。
我们现在有以下问题:
- Oracle 中的会话 1 插入一行,写入序列号(比如 45),但在 Oracle 中未执行任何 COMMIT。
- Oracle 中的会话 2 插入一行,写入序列号(假设为 49(因为 Oracle 中的序列可能有间隙))并在 Oracle 中完成 COMMIT。
- PostgreSQL 中的会话从 Oracle 中获取 sequenceNumber > 44 的行(因为 lastSequenceNumberFetched 为 44)并获取 sequenceNumber 为 49 的行。所以这是新的 lastSequenceNumberFetched。
- Oracle 中的会话 1 进行提交。
- PostgreSQL 中的会话从 Oracle 获取序列号 > 49 的行。问题是序列号为 45 的行永远不会被获取。
对于我们的用例是否有更好的方法来避免我们的数据丢失问题?
【问题讨论】:
-
您是否考虑过根本不进行复制并使用使 Oracle 表在 Postgres 中可用的外部数据包装器?
标签: database oracle postgresql data-synchronization