在 Oracle 和 PostgreSQL 之间移动数据

Bas*_*ing 1 postgresql oracle migration dump

对于未来的项目,我需要使用以下设置:

一些小的(离线)数据框(随着时间的推移收集数据)填满了 PostgreSQL 数据库(大约1 TB a year总共)。

有时,我有机会将数据从这些盒子中移出(到棒或移动驱动器上)并将其导入到庞大的企业 Oracle 数据库中。

到目前为止,这希望不是一个非常糟糕的解决方案。目前,我正在寻找准备好以后易于使用的东西。

有没有人做过这样的事情?

  • 经验,该做什么和要预防什么?
  • 还有其他兼容性吗?
  • 需要提前做什么?
  • 如何移动数据?特殊的转储设置?

Cra*_*ger 7

学习和使用 ETL 工具

如果您使用 Pentaho Kettle 或 Talend Studio 等 ETL 工具来自动化数据传输和合并,您将节省大量时间和痛苦。他们会很高兴地连接到 Pg 实例和 Oracle 实例,并使用非常灵活的策略进行所需的复制和合并。他们也可以使用 CSV 转储。

使用 CSV 转储

如果您需要使用转储,请尝试使用COPY ... FORMAT CSV而不是尝试进行与pg_dumpOracle 兼容的部分转储来转储单个表。这将在将它们导入其他 DBM 时为您节省大量时间,因为几乎所有内容都可以理解 CSV。保持每个实例的架构一致,这样您就不需要为不同的实例处理不同的架构。

使用不相交的集合或复合键

在使用唯一键的情况下,请确保将不相交的键范围分配给不同的实例(例如,键范围是instance_id * 10^7to (instance_id + 1 * 10^7)-1)或使用 的复合键(instance_id, generated_key)。如果您使用不相交的范围,请添加一个CHECK约束来强制执行它;类似地,如果使用复合键添加CHECK约束以强制instance_id零件为常数。

最小公分母数据类型

避免使用 PostgreSQL 数组、记录类型和hstore. 它们都将转储为转储中的字符串文字CSV,您必须解析它们才能对它们做一些有用的事情。例如:

regress=> SELECT ROW( ARRAY[1,2,3], ARRAY['a','b','withquotehere:''inline', 'doublequotehere:"'], ARRAY[ ROW(1,'a'), ROW(2,'b') ] );
                                            row                                             
--------------------------------------------------------------------------------------------
 ("{1,2,3}","{a,b,withquotehere:'inline,""doublequotehere:\\""""}","{""(1,a)"",""(2,b)""}")
(1 row)
Run Code Online (Sandbox Code Playgroud)

你真的,真的不想解析那个。这是一个非常极端的情况,一个匿名记录值包含三个不同的数组,一个是整数数组,一个是包含引号的字符串数组,一个是匿名两字段行元组数组。但是说真的……使用简单的关系建模和 CSV 导出,如果您知道将要进行大量跨数据库工作,那么复合类型、hstore 和数组的便利性就不值得为兼容性而烦恼。

实际上可以在您的模式中使用它们,您只需要COPY FROM一组查询将它们扩展为适当的关系结构。既然您将不得不这样做,那么您不妨首先使用常规关系建模,从而为自己省去一些痛苦。

枚举没问题;您可以在加载它们时将它们视为字符串。无论如何,它们只是一个方便且高效的边表和 FK 约束的快捷方式,允许您避免连接和排序。

在现代 PostgreSQL 中,bytea输出为十六进制字符串。在旧版本中,它输出为八进制转义序列。无论哪种方式,您都可以varchar将其加载到Oracle 中的列中,然后如果您无法让 Oracle 以本机方式理解表示形式,则将其转换。我还没有处理过 Oracle 二进制类型,所以我无法提供更多帮助。

  • 今天(2016 年)人们可能会为此使用外部数据包装器 (3认同)