web-dev-qa-db-ja.com

mysqlをpostgresqlに変換する方法は?

大きなmysqlデータベースをpostgresqlに変換するための変換ツールを必死に探しています。次のツール/スクリプトが必要です。

  • 自由
  • Linuxで動作
  • 使いやすく、バグがない
  • 実際に試して、動作することを確認しました
  • できれば、JavaまたはRuby

リストされているさまざまなツールを試しました here が、どれもうまくいきませんでした。

前もって感謝します。

14
hbp

2つの非常に異なるDBMS間での移行には、データを移行するだけではなくlotが必要です。しかし、通常はデータの移行が最も簡単な部分です。

私が試した方法は無料で、それが機能することを確認できます:

  • mysqlスキーマのみのダンプを作成する
  • テキストエディターと多くの検索と置換を使用してSQLを調整する
  • postgresで変換されたSQLを実行する
  • MySQLからプレーンテキストダンプを作成します(CSVなどの区切り形式)
  • postgreSQLのCOPYコマンドを使用してデータをインポートする

MySQLの動作に依存して違法なデータを受け入れる場合(2月31日など)、データのインポートは実際には難しい場合があります。

私の推測では、これはツールを検索し、それらの束を評価してから、選択したものを理解しようとするよりも速くなります。しかし、それはあなたがどのような「大きな」を参照しているかに依存します。数百のテーブルが大きい場合、これは実行できない可能性があります。 bigが行数のみを参照している場合は、これがおそらく最も速い方法です。

LiquibaseSchemaSpy または WbSchemaReport のように、DBMSに依存しない(XML)形式でデータベーススキーマをダンプできるツールがいくつかあります。おそらくLiquibaseが最も使いやすいでしょう。他のものは、生成されたXMLを変換するために、XSLTを記述/拡張するいくつかの手動作業を必要とします。

MySQLでトリガーとストアドプロシージャを使用している場合、後で大規模な手動修正を必要とせずにそれらを変換できるany自動化ツールがあるとは思わない-生成されたプロシージャはおそらく使用しないターゲットDBMSの高度な機能。

最近それをしなければならなかったし、ツールを探してそれを使って何かをすることができるようになるには時間がかかりすぎたので、vimと置換fooを使って手でそれをやった

  • INT NOT NULL AUTO_INCREMENT(またはこのようなもの)をSERIALに置き換えます
  • TEXTに関連するすべての文字列を変更します(TEXTVARCHARなどを使用しても速度に違いはありません)
  • それらのf *** ingバックティックを取り除く `
  • postgresにはストレージエンジンがないため、ENGINE InnoDB(またはその他)を削除します
  • 削除UNSIGNED
  • すべてのBLOBフィールドはBYTEAです
  • 文字列は単一引用符'のみを使用します
  • 9.1以降で文字列連結を使用する場合は注意してください。Postgresは、非標準の文字列連結のフォールバックとしてCONCATをサポートしています。9.1より前は、'string' || ' string'を使用して行われていました
  • 手続き型コードを書き直す...
  • 予約されている名前(テーブル、名前など)と大文字の名前に注意してください。二重引用符で囲む必要があります"
  • 構文は変わらないため、インデックスはほぼ同じである必要があります
  • 私が忘れていたすべてのものについて、 このトピックに関するウィキブックをチェックしてください

これらの各箇条書きは、1つの置換で実行する必要があります。

スキーマとデータを個別にエクスポートしましたINSERTではなくCOPYsを使用してください。何も起こっていないのであれば、データは(ほとんど)クリーンアップを必要としません。すべてがUTF-8にあることを確認してください。 2つの独立したファイルを使用すると、スキーマが管理しやすくなり、編集する1 GBのファイルがありません。

スキーマをロードすると、エラーのある場所でかなり詳細な情報が得られるため、デバッグは非常に簡単です。

6
DrColossos

私はこれを一度も試したことがないので捨てますが、 Tungesten Replicator はあなたが望むことをするかもしれません。それは主に複製ツールですが、少なくともデータの一部で役立つブートストラッププロセスがあると思います。

1
Aaron Brown