在 Oracle 和 PostgreSQL 之間移動數據
對於未來的項目,我需要使用以下設置:
一些小的(離線)數據框(隨著時間的推移收集數據)填充 PostgreSQL 數據庫(大約
1 TB a year
總共)。有時,我有機會將數據從這些盒子中移出(移動到記憶棒或移動驅動器上),然後將其導入到龐大的企業 Oracle 數據庫中。
到目前為止,希望這不是一個非常糟糕的解決方案。目前,我正在尋找准備好以便以後使用的東西。
有沒有人做過這樣的事情?
- 經驗,做什麼和預防什麼?
- 還有其他兼容性嗎?
- 需要提前做的事情?
- 如何移動數據?特殊轉儲設置?
學習和使用 ETL 工具
如果您使用諸如 Pentaho Kettle 或 Talend Studio 之類的 ETL 工具來自動化數據傳輸和合併,您將節省大量時間和痛苦。他們將愉快地連接到 Pg 實例和 Oracle 實例,並使用非常靈活的策略進行所需的複制和合併。他們也可以使用 CSV 轉儲。
使用 CSV 轉儲
如果您需要使用轉儲,請嘗試使用轉儲單個表,
COPY ... FORMAT CSV
而不是嘗試進行與pg_dump
Oracle 兼容的部分轉儲。在將它們導入其他 DBM 時,這將為您節省大量時間,因為幾乎所有東西都理解 CSV。保持每個實例的模式一致,這樣您就不需要為不同的實例處理不同的模式。使用不相交的集合或複合鍵
在使用唯一鍵的地方,確保將不相交的鍵範圍分配給不同的實例(例如鍵範圍是
instance_id * 10^7
to(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 二進制類型,所以我幫不上什麼忙。