web-dev-qa-db-ja.com

OracleとPostgreSQL間のデータの移動

今後のプロジェクトでは、次の設定を使用する必要があります。

いくつかの小さな(オフライン)データボックス(時間をかけてデータを収集)がPostgreSQLデータベースを満たします(約1 TB a year 合計で)。

時々、これらのボックスからデータを(スティックまたはモバイルドライブに)移動し、巨大な企業のOracleデータベースにインポートする機会がありました。

これまでのところ、これはうまくいけば本当に悪い解決策ではありません。現時点では、後で簡単に使用できるように準備するものを探しています。

誰かがそのようなことをしたことがありますか?

  • 経験、何をすべきか、何を防ぐべきか?
  • 他の互換性はありますか?
  • 事前にすべきことは?
  • データを移動するには?特別なダンプ設定?
1
Bastian Ebeling

ETLツールを学び、使用する

Pentaho KettleやTalend StudioなどのETLツールを使用してデータ転送とマージを自動化すると、時間と手間を大幅に節約できます。それらはPgインスタンスとOracleインスタンスにうまく接続し、非常に柔軟な戦略を使用して必要なコピーとマージを行います。 CSVダンプも消費する可能性があります。

CSVダンプを使用する

ダンプを使用する必要がある場合は、COPY ... FORMAT CSVを使用してOracle互換の部分ダンプを実行するのではなく、pg_dumpを使用して個々のテーブルをダンプしてください。ほとんどすべてがCSVを理解しているので、他のDBMsesにインポートするときに大幅な時間を節約できます。インスタンスごとに異なるスキーマを処理する必要がないように、インスタンスごとにスキーマを整合させてください。

互いに素なセットまたは複合キーを使用する

一意のキーを使用する場合は、異なるインスタンスに別々のキー範囲を割り当てるか(たとえば、キー範囲はinstance_id * 10^7から(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)

あなたは本当に、本当にそれを解析する必要はありません。これはかなり極端なケースです。1つは整数の配列、1つは引用符を含む文字列の配列、もう1つは匿名の2フィールド行タプルの配列の3つの異なる配列を含む匿名レコード値です。しかし真剣に...単純なリレーショナルモデリングとCSVエクスポートを使用します。DB間で多くの作業を行うことがわかっている場合、コンポジットタイプ、hstore、および配列の利便性は互換性の痛みに値しません。

実際にスキーマでそれらを使用することは可能であり、それらを適切なリレーショナル構造に拡張する一連のクエリをCOPY FROMする必要があるだけです。これを行う必要があるため、そもそも通常のリレーショナルモデリングを使用して、手間を省くことができます。

列挙型は問題ありません。あなたはそれらをロードするときにそれらを文字列として扱うことができます。いずれにしても、サイドテーブルとFK制約の便利で高性能なショートカットにすぎず、結合や並べ替えを回避できます。

最近のPostgreSQLでは、byteaは16進文字列として出力されます。古いバージョンでは、8進数のエスケープシーケンスとして出力されます。どちらの方法でも、それをOracleのvarchar列にロードして、Oracleでネイティブに表現を理解できない場合は変換できます。私はOracleのバイナリ型を扱っていないので、それ以上は手助けできません。

7
Craig Ringer