web-dev-qa-db-ja.com

MySQLからPostgreSQLへの切り替え-ヒント、コツ、落とし穴?

MySQLからPostgreSQLへの切り替えを考えています。

PostgreSQLを使用するためのヒント、コツ、落とし穴は何ですか?

MySQLerは何に注意する必要がありますか?

参照: PostgreSQLとMySQLの違いは?
関連項目: MySQLからPostgreSQLへの移行

注-これは重複しているとは思いません。特に、回答の種類はかなり異なり、ここでの回答には実装の詳細がはるかに多く、私が探していたものです

35
Toby Hede

自分でこれを経験しただけです、まあ私はまだです...

  • 大文字と小文字を区別するテキスト
  • _INSERT IGNORE_とREPLACEの欠如
  • ほとんどどこでも明示的なキャストが必要
  • バックティックなし
  • _LOAD DATA INFILE_(COPYは近いですが、十分に近いわけではありません)
  • autoincrementSERIALに変更します
  • MySQLでは悪い形式ですが、PostgresではON句のない_INNER JOIN_は発生しません。_CROSS JOIN_などを使用してください
  • COUNT(*)は非常に遅くなる可能性があります
  • データベースは、テーブルではなく文字セットでエンコードされます
  • 複数のスキーマを持つ複数のデータベースを持つことができます(MySQLには実際には1つのデータベースと複数のスキーマしかありません)
  • パーティショニングが異なります
  • MySQL interval vs. Postgres interval(時間間隔の場合)
  • 暗黙的な列の名前変更、PostgresにはASが必要です
  • Postgresで複数のテーブルを同時に更新することはできません
  • Postgres関数は強力です。したがって、CALL proc();はありません。 proc()を関数およびSELECT proc();として書き直します。
52
rfusca

コードベース全体をテストする必要があるため、これは大規模なタスクになります。

  • 構文
  • 正しい動作(つまり、同じ結果を返します)
  • パフォーマンス-例:パフォーマンスの低下/改善はありますか?それらを処理できますか?
  • エラー処理-エラー条件下では同じように動作しません。コードが特定のエラーコードに依存していた可能性があります

運用上、以下を確認する必要があります。

  • 復元する
  • ディスクスペースの使用率
  • メモリ使用率
  • 1回限りのデータ移行-大きな/時間のかかるタスクになる可能性があります
  • 失敗した場合のロールバック計画
  • 監視-MySQLをどのように監視しており、それらの方法を適応させることができますか
  • (該当する場合)-レプリケーション

そのような動きを検討する前に、間違いなく大量のパフォーマンステストを行う必要があります。

これらのコストにより、別のデータベースへの移動は、ほとんどの重要なアプリにとって高額になります。メリットを検討してください[〜#〜] very [〜#〜]すべてを実行するための莫大なコストに対して慎重に上記。

些細なアプリケーションで3か月もかからず、その間は定期的な開発を続けることができないとしたら、私は驚きます。

9
MarkR

最も一般的な問題を含む PostgreSQL gotchas を試すことができます。一般的に、PostgreSQLのドキュメントもかなり良いので、枕の下にも置いておきます。

また、 MySQLからPostgreSQLへの変換 pgsqlwikiにあります。

8
janneb

MySQLデータベースとPostgreSQLデータベースに接続し、コンテンツを転送するだけのこのスクリプトを見つけました。それは私にとって魅力のように働きました。

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

によってインストールされました

$ pip install py-mysql2pgsql

実行

$ py-mysql2pgsql

任意のフォルダーに保存すると、データベースの詳細を編集および入力できるテンプレート設定ファイル(mysql2pgsql.yml)が作成されます。

それが機能するためには、argparseをインストールする必要がありました。

$ pip install argparse

データベースの詳細が入力されたら、もう一度実行します

$ py-mysql2pgsql

設定ファイルと同じフォルダにあります。これで完了です。画面には何も印刷されませんでしたが、その後データベースが完全にコピーされました。

6
Dahlo

変換する前に、サーバーを次のコマンドで起動して、MySQLをANSI-strictnessに設定します。--transaction-isolation = SERIALIZABLE --sql-mode = ANSI

MyIsamテーブルを使用していないことを確認してください。

MySQLは、すべきでない多くの変換を許可します。 pgにはキャストが必要です。

ストアドプロシージャ、関数、およびトリガーを書き直す必要があります。 pgはこれらの言語の選択肢を提供しますが、言語をインストールする必要があります。 MySQLほどユーザーフレンドリーではありません。

pgは、groupbyまたはaggregateである列のみを選択リストで許可します。これを行うと、MySQLはグループの最初の値を選択することでチートします。

MySQLは多くの拡張機能を追加します:等しくない演算子は!= Cと同様に、「&&」を「および」、「||」の同義語として使用できます。 'または'など。特に、pgは '||'を使用します。文字列の連結を意味します。

基本的に、pgはかなり厳密にANSIですが、MySQLはそうではありません。 pgに変換する前に、MySQLをできるだけ厳密なANSI準拠にし、アプリケーションの実行時に警告がないかどうかを確認することを強くお勧めします。

5
tpdi

手動調整を避けられないデータベース構造の移動は別として...

データの転送の最も信頼できる方法(構造が同じであれば、テーブルごとに):

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を記述するだけです。

1
Ivka