PostgreSQLデータベースをMS SQL 2005に移行するのに最適なツールですか?


8

テーブルスキーマとデータの両方を含め、MS SQL Server 2005(またはおそらく2008)に移行したいPostgreSQL 8.3.1のデータベースがあります。データベースのサイズは約50GB、行数は約400,000,000なので、単純なINSERTステートメントは問題外だと思います。誰もがこの移行を実行するための最良のツールを推奨できますか?明らかに信頼性が必要であり、データはターゲットDBでもソースDBでもまったく同じであり、このボリュームのデータを妥当な時間内にコピーできる必要があります。


4
好奇心から抜け出して:なぜ地球上でこれをしたいのですか?
wzzrd

単にdb機能以外の理由でWindowsサーバーに移行していると思いますか?:)
warren 09/09/15

回答:


6

私が試したものは大きなテーブルでは機能しなかったため、データにサードパーティのツールを使用しなくなりました。SSISでさえ失敗しました。ただし、スキーマには商用ツールを使用しました。だから私の変換プロセスは次のとおりでした:

  1. スキーマをコピーする完全変換エンタープライズ(データなし)。
  2. pg_dumpは、Postgresからデータを「プレーンテキスト」形式でエクスポートします。これは、基本的にタブ区切り値(TSV)ファイルです。
  3. エクスポートされたファイルをbcpが理解できるフォーマットに変換するPythonスクリプト。
  4. bcpを使用して、データをMSSQLにインポートします。

変換ステップでは、pg_dumpとbcpで使用される次のような形式の違いに対処しました。

  • pg_dumpはファイルの先頭にPostgres固有のものを置き、データを「。」で終了しますが、bcpはファイル全体にデータが含まれていることを期待します
  • pg_dumpはNULL値を "\ N"として格納しますが、bcpはNULLの代わりに何も期待しません(つまり、列区切り文字の間にデータはありません)。
  • pg_dumpはタブを「\ t」としてエンコードし、改行を「\ n」としてエンコードしますが、bcpはそれらを文字通り扱います
  • pg_dumpでは常にタブと改行を区切り文字として使用しますが、bcpではユーザーが区切り文字を指定できます。データがタブまたは改行を含んでいる場合、これらはエンコードされていないため、これが必要になります。

また、Postgresで問題なかったいくつかの固有の制約がMSSQLで違反されているため、それらを削除する必要があったこともわかりました。これは、MSSQLではNULL = NULLであるため(つまり、NULLは一意の値として扱われるため)、Postgresではそうではなかったためです。


これはSQLサーバーの癖です。一意の制約の代わりに、フィルターされた一意のインデックス(WHERE column_name IS NOT NULL)を設定する必要があります。
苦境

あなたは私を上司に購入するように説得したツールを私に導きました。その素晴らしい#FullConvert
mugume david

6

SQL 2005ボックスに適切なPostgresサポートドライバーがインストールされている場合(またはODBC経由でPostgresを使用する場合、またはPostgresからファイルにデータをダンプしてそこからインポートする場合)、SQL Serverのインポート/エクスポートウィザードを使用できます。データをコピーするための注文。これにより、さまざまな質問が表示され、適切なバッチ挿入操作を使用して、SQL Server Integration Services(SSIS)パッケージジョブとしてインポートが実行されます。

ただし、そのウィザードがオプションではない場合、多数の行があるにもかかわらず、行の個々のサイズは平均で135バイト未満であり、50 GBのトランザクションが発生するのに十分なトランザクションログスペースが与えられていることを考慮する価値があります '単純な挿入」ステートメント自体は問題外ではありません。


1
データをエクスポートしてSQL Serverにインポートする場合は、BCP(SQLサーバーに付属するユーティリティ)の使用を検討してください。SPGを使用することは良い考えですが、PGサーバーから直接取得したい場合は、ログの問題が発生する可能性があります。
ColtonCat 2009

SSISパッケージは非常に有望に聞こえたので試してみましたが、残念ながらメモリ不足で失敗しました。:(エラー[HY000]タプルの読み取り中にメモリが不足しています。;クエリの実行中にエラーが発生しました(PSQLODBC35W.DLL)
EMP


0

10年近く経ちますが、これはまだ簡単な問題ではありません。最終的にハイブリッドソリューションになり、次のコマンドを使用してスキーマとテーブル/列のコメントをエクスポートすることで、独自のスキーママッパーをロールバックしました。

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql

次に、スキーマをT-SQLに変換するPHPスクリプトを作成しました。その後、次のサードパーティソフトウェアを使用して、行を実際にインポートしました(アフィリエーションなし)。

http://www.convert-in.com/pgs2mss.htm

少し遅いですが、今のところとても良いです。私たちのデータベースはあなたのデータベースよりも小さく、わずか15GBでしたが、そのツールはそれをうまく処理するように見えました。それは私が約50ドルで見つけた中で最も安いものでもありました。これまでのところ、投資する価値はあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.