今後のプロジェクトでは、次の設定を使用する必要があります。
いくつかの小さな(オフライン)データボックス(時間をかけてデータを収集)がPostgreSQLデータベースを満たします(約1 TB a year
合計で)。
時々、これらのボックスからデータを(スティックまたはモバイルドライブに)移動し、巨大な企業のOracleデータベースにインポートする機会がありました。
これまでのところ、これはうまくいけば本当に悪い解決策ではありません。現時点では、後で簡単に使用できるように準備するものを探しています。
誰かがそのようなことをしたことがありますか?
Pentaho KettleやTalend StudioなどのETLツールを使用してデータ転送とマージを自動化すると、時間と手間を大幅に節約できます。それらはPgインスタンスとOracleインスタンスにうまく接続し、非常に柔軟な戦略を使用して必要なコピーとマージを行います。 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のバイナリ型を扱っていないので、それ以上は手助けできません。