Oracle

在 Oracle 和 PostgreSQL 之間移動數據

  • October 21, 2016

對於未來的項目,我需要使用以下設置:

一些小的(離線)數據框(隨著時間的推移收集數據)填充 PostgreSQL 數據庫(大約1 TB a year總共)。

有時,我有機會將數據從這些盒子中移出(移動到記憶棒或移動驅動器上),然後將其導入到龐大的企業 Oracle 數據庫中。

到目前為止,希望這不是一個非常糟糕的解決方案。目前,我正在尋找准備好以便以後使用的東西。

有沒有人做過這樣的事情?

  • 經驗,做什麼和預防什麼?
  • 還有其他兼容性嗎?
  • 需要提前做的事情?
  • 如何移動數據?特殊轉儲設置?

學習和使用 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)

你真的,真的不想解析它。這是一個非常極端的情況,一個匿名記錄值包含三個不同的數組,一個是整數數組,一個是包含引號的字元串數組,另一個是匿名兩欄位行元組數組。但說真的……如果你知道你會做大量的跨數據庫工作,那麼使用簡單的關係建模和 CSV 導出,複合類型、hstore 和數組的便利不值得兼容性的痛苦。

實際上可以在您的模式中使用它們,您只需要COPY FROM一組查詢,將它們擴展為適當的關係結構。由於您將不得不這樣做,因此您不妨首先使用正常關係建模並為自己省點麻煩。

列舉沒問題;您可以在載入它們時將它們視為字元串。無論如何,它們只是邊表和 FK 約束的便捷且高性能的快捷方式,可讓您避免連接和排序。

在現代 PostgreSQL 中,bytea輸出為十六進製字元串。在舊版本中,它以八進制轉義序列的形式輸出。無論哪種方式,您都可以varchar將其載入到 Oracle 中的列中,然後如果您無法讓 Oracle 以本機方式理解表示,則將其轉換。我沒有處理過 Oracle 二進制類型,所以我幫不上什麼忙。

引用自:https://dba.stackexchange.com/questions/34593