2009-04-21 21 views
32

私は、MySQLからPostgreSQLへの切り替えを考えています。MySQLからPostgreSQLへの切り替え - ヒント、秘訣、

PostgreSQLを使用するためのヒント、秘訣、問題点はありますか?

MySQLerは何を検討すべきですか?

も参照してください:How different is PostgreSQL to MySQL?
も参照してください:Migrate from MySQL to PostgreSQL

注意を - 私はこれが重複しているとは思いません。特に答えのタイプはかなり異なります。ここでの回答には、私が探していたより詳細な実装の詳細があります。

+0

ちょうど注記:これは実際にはOracleとSunのニュースとは関係ありません。私は複数のデータベースを必要とし、PostgreSQLスキーマを使用して見ているRailsアプリケーションを持っています。 –

+0

参照:http://stackoverflow.com/questions/724867/how-different-is-postgresql-to-mysql – vartec

答えて

49

ちょうどこの自分自身を通過しましたが、私はまだです...INSERT IGNOREREPLACE

  • 明示的なキャストの

    • 大文字と小文字を区別テキスト
    • 欠如はにほとんどどこでも
    • ないバッククォート
    • LOAD DATA INFILECOPYが近いが、十分に近接していない)
    • 変更autoincrementを必要とSERIAL
    • ON句が起こることはできませんせずにMySQLで悪いフォームは、Postgresの中で、INNER JOINは、CROSS JOINを使用するなど
    • COUNT(*)はクレイジー遅い
    • 文字セットでエンコードされたデータベースではなく、テーブル
    • あなたにすることができますがPostgresのinterval
    • パーティションが異なる
    • (MySQLは本当にただ一つのデータベースと複数のスキーマを持つ)複数のスキーマで、複数のデータベースを持つことができますMySQLの interval(時間間隔)
    • 暗黙の列の名前変更、Postgresが必要ですAS
    • Postgresで複数のテーブルを同時に更新できません
    • Postgresの機能は強力です。したがって、CALL proc();はありません。機能としてproc()を書き換え、SELECT proc();を書き換えます。
  • +0

    +1:Auto_increment to serial?シーケンスはありませんか? –

    +1

    @OMG Ponies:現代版のPGでは、自動IDにシーケンスを明示的に使用する必要はありません。シリアル型とビッグシリーズ型は、そのシーケンスの意味をすべて隠していますが、シーケンスとそのすべてのパワーの下にあります。自動的に名前付きシーケンスを作成し、列のデフォルト値をnextvalに設定します。 – rfusca

    +0

    私はOracleから来ているので、私はシーケンスを好みます。シリアル/ビッグシリアル機能がいつ導入されましたか?8.x? –

    8

    よくある問題を含むPostgreSQL gotchasを試してみることができます。一般に、PostgreSQLのドキュメントもかなり良いので、それもあなたの枕の下に置いてください。

    また、pgsql wikiのConverting from MySQL to PostgreSQLもあります。 --transaction-分離= SERIALIZABLE --sql-モード= ANSI

    あなたはMyISAMテーブルを使用していないことを確認してください:で、サーバを起動してANSI-厳密にあなたのMySQLを設定し、変換する前に

    5

    MySQLでは、必要ではない多くの変換が可能です。 pgにはキャストが必要です。

    保存されているprocs、関数、およびトリガーを書き直す必要があります。 pgではこれらの言語を選択できますが、言語をインストールする必要があります。それはMySQLほどユーザーフレンドリーではありません。

    pgは、選択リスト内でグループに属する列または集計である列のみを許可します。あなたがこれを行うならば、MySQLはグループの最初の値を選択することで不正行為をするでしょう。

    MySQLは、Cでのように!=となることがあります。 'と'、 '||'の同義語として '& &' 'or'などのために使用されます。特に、pgは '||'文字列カテナネーションを意味します。

    基本的に、pgはかなり厳密にANSIですが、MySQLはそうではありません。あなたのアプリケーションを実行するときに警告をチェックしてから、pgに変換する前にMySQLを厳密にANSI準拠にすることを強くお勧めします。

    9

    あなたがあなたの全体のコードベースをテストする必要がありますよう、大規模な作業になるだろう -

    • のために、どこでも、すべての単一のクエリを構文
    • 正しい行動(すなわち返します同じ結果)
    • パフォーマンス - たとえばパフォーマンスの低下/改善はありますか?それを処理できますか?
    • エラー処理 - 彼らはおそらくあなたのコードは、特定のエラーコード
    • 。動作

    に頼った、エラー条件の下で同じように動作していないあなたが見てする必要があります。 を復元/

    • バックアップ
    • ディスク容量の使用率
    • メモリ使用率
    • 大量の/時間のかかる作業である可能性があります
    • ロールバック計画のためのそれは
    • 監視失敗した場合 - どのようにあなたがMySQLを監視しているが、それらの方法を適合させることができる
    • (該当する場合) - あなたは間違いなく大きな金額を行う必要がありますレプリケーション

    そのような動きを検討する前に、

    これらのコストは、ほとんどの重要でないアプリケーションでは高価すぎる別のデータベースに移動することになります。上記のすべてを行うには膨大な膨大な費用に対して、慎重に、VERYを考慮してください。

    普通の開発を続けることができない重要なアプリケーションでは、3ヶ月もかからないと驚くでしょう。

    +4

    これは新しいプロジェクトであるため、この段階では移行にコストはかかりません。しかし、これはすべて考慮すべき素晴らしいアドバイスです。 –

    6

    あなたのMySQLデータベースとPostgreSQLデータベースに接続し、内容を転送するだけのこのスクリプトが見つかりました。それは私の魅力のように働いた。

    https://github.com/philipsoutham/py-mysql2pgsql

    は、任意のフォルダに

    $ pip install py-mysql2pgsql 
    

    実行

    $ py-mysql2pgsql 
    

    によってインストールされ、それはあなたが編集できる設定は、あなた(mysql2pgsql.yml)用のファイルのテンプレートを作成し、

    私はargparsをインストールする必要がありましたそれが働くためのe。データベースの詳細が記入されている

    $ pip install argparse 
    

    、単に設定ファイル、およびワムと同じフォルダに再び

    $ py-mysql2pgsql 
    

    それを実行するには、設定は完了です。画面には何も印刷されませんでしたが、後でデータベースが完全にコピーされました。

    +0

    フォーラム(データベースを使用するソフトウェア)に投稿やコメントを追加できないことが判明しましたが、postgresqlデータベースをファイルにエクスポートし、データベースを削除して作成し、ファイルをインポートすることで解決しました。誰が知っている、私はちょうど私が最初にそれをインポートした私のテストDBのユーザーの間違ったユーザーのアクセス許可を持っている可能性があります.. – Dahlo

    1

    別に手動調整を避けることができないデータベース構造を、移動の...

    転送するデータの中で最も信頼性の高い方法(テーブルによってテーブルには、構造が同じであることを提供する):

    mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt 
    
    psql 
    \copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL'; 
    

    最近(他にもたくさんのオプション+ sedなどでmysqldumpのような)他の方法を試してみましたが、これほど素晴らしいものはありませんでした。

    このアプローチでは、構造が途中で変更されたときにも柔軟性が得られます。適切なSELECTを書くだけです。

    関連する問題