MySQLからPostgreSQLへの切り替えを考えています。
PostgreSQLを使用するためのヒント、コツ、落とし穴は何ですか?
MySQLerは何に注意する必要がありますか?
注-これは重複しているとは思いません。特に、回答の種類はかなり異なり、ここでの回答には実装の詳細がはるかに多く、私が探していたものです
自分でこれを経験しただけです、まあ私はまだです...
INSERT IGNORE
_とREPLACE
の欠如LOAD DATA INFILE
_(COPY
は近いですが、十分に近いわけではありません)autoincrement
をSERIAL
に変更しますON
句のない_INNER JOIN
_は発生しません。_CROSS JOIN
_などを使用してくださいCOUNT(*)
は非常に遅くなる可能性がありますinterval
vs. Postgres interval
(時間間隔の場合)AS
が必要ですCALL proc();
はありません。 proc()
を関数およびSELECT proc();
として書き直します。コードベース全体をテストする必要があるため、これは大規模なタスクになります。
運用上、以下を確認する必要があります。
そのような動きを検討する前に、間違いなく大量のパフォーマンステストを行う必要があります。
これらのコストにより、別のデータベースへの移動は、ほとんどの重要なアプリにとって高額になります。メリットを検討してください[〜#〜] very [〜#〜]すべてを実行するための莫大なコストに対して慎重に上記。
些細なアプリケーションで3か月もかからず、その間は定期的な開発を続けることができないとしたら、私は驚きます。
最も一般的な問題を含む PostgreSQL gotchas を試すことができます。一般的に、PostgreSQLのドキュメントもかなり良いので、枕の下にも置いておきます。
また、 MySQLからPostgreSQLへの変換 pgsqlwikiにあります。
MySQLデータベースとPostgreSQLデータベースに接続し、コンテンツを転送するだけのこのスクリプトを見つけました。それは私にとって魅力のように働きました。
https://github.com/philipsoutham/py-mysql2pgsql
によってインストールされました
$ pip install py-mysql2pgsql
実行
$ py-mysql2pgsql
任意のフォルダーに保存すると、データベースの詳細を編集および入力できるテンプレート設定ファイル(mysql2pgsql.yml)が作成されます。
それが機能するためには、argparseをインストールする必要がありました。
$ pip install argparse
データベースの詳細が入力されたら、もう一度実行します
$ py-mysql2pgsql
設定ファイルと同じフォルダにあります。これで完了です。画面には何も印刷されませんでしたが、その後データベースが完全にコピーされました。
変換する前に、サーバーを次のコマンドで起動して、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準拠にし、アプリケーションの実行時に警告がないかどうかを確認することを強くお勧めします。
手動調整を避けられないデータベース構造の移動は別として...
データの転送の最も信頼できる方法(構造が同じであれば、テーブルごとに):
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を記述するだけです。