web-dev-qa-db-ja.com

MySqlからPostgreSqlへの移行

私のPostgreSQLはWindowsにインストールされています。 MySQLデータベースからPostgreSQLにデータを移行するにはどうすればよいですか?私はたくさんのariclesを読みました。何も役に立たない:(

ありがとう。

私の行動:

  1. mysqlダンプ:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  2. pgsqlでdbシンクロナイザーを作成する

  3. インポートダンプ:

    psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
    
  4. 出力:

    psql:C:/dump.sql:17: NOTICE:  table "Db_audit" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:30: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(11) NOT NULL,
               ^
    psql:C:/dump.sql:37: ERROR:  syntax error at or near ""Db_audit""
    СТРОКА 1:LOCK TABLES "Db_audit" WRITE;
                 ^
    psql:C:/dump.sql:39: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (4068,4036,4,1,32,'2010-02-04 ...
                 ^
    psql:C:/dump.sql:40: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (19730,2673,2,2,44,'2010-11-23...
                 ^
    psql:C:/dump.sql:42: ERROR:  syntax error at or near "UNLOCK"
    СТРОКА 1:UNLOCK TABLES;
     ^
    psql:C:/dump.sql:48: NOTICE:  table "ZHNVLS" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:68: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(10) unsigned NOT NULL,
               ^
    psql:C:/dump.sql:75: ERROR:  syntax error at or near ""ZHNVLS""
    СТРОКА 1:LOCK TABLES "ZHNVLS" WRITE;
                 ^
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...???????? ??? ???????','10','4607064820115','0','','??????-??...
                                                          ^
    ПОДСКАЗКА:  Use the escape string syntax for escapes, e.g., E'\r\n'.
    Cancel request sent
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...??????????? ????????','10','4602784001189','0','','???????? ...
    
21

MySQLでの私の経験-> Postgresqlへの移行は本当に面白くなかったので、CSVファイルに関するDanielの提案を2番目にする必要があります。

私の場合、手でスキーマを再作成し、mysqldumpとpg_restoreを使用してすべてのテーブルを1つずつインポートしました。

したがって、このダンプ/復元はデータに対して機能する可能性がありますが、スキーマがうまくいかない可能性があります。私は商用ソリューションを試したことがないので、他の人の意見を見て、幸運を祈ります!

[〜#〜] update [〜#〜]:プロセスが残したコードを確認しました。実際のコードは次のとおりです。

PostgreSQL dbに少し異なるスキーマがあったので、いくつかのテーブルが結合され、いくつかが分割されました。これが、単純なインポートがオプションではなかった理由であり、私のケースはおそらくあなたが説明するものよりも複雑であり、このソリューションはやり過ぎかもしれません。

PGデータベースの各テーブルに対して、MySQLデータベースから関連データを選択するクエリを作成しました。テーブルが両方のデータベースで基本的に同じで、結合がない場合は、これと同じくらい簡単にすることができます

select * from mysql_table_name

次に、このクエリの結果をXMLにエクスポートしました。これを行うには、次のように実行する必要があります。

echo "select * from mysql_table_name" | mysql [CONNECTION PARAMETERS] -X --default-character-set=utf8 > mysql_table_name.xml

これにより、次の構造を持つ単純なXMLファイルが作成されます。

<resultset statement="select * from mysql_table_name">
  <row>
    <field name="some_field">field_value</field>
    ...
  </row>
  ...
</resultset>

次に、このXMLファイルの行要素ごとにINSERTステートメントを生成するスクリプトを作成しました。データを挿入するテーブルの名前は、このスクリプトのコマンドラインパラメータとして指定されています。 Pythonスクリプト (必要な場合)。

これらのsqlステートメントはファイルに書き込まれ、次のようにpsqlに送られます。

psql [CONNECTION PARAMETERS] -f FILENAME -1

XML-> SQL変換で唯一のトリックは、数値を認識し、引用符を外さないことです。

まとめると、mysqlはクエリ結果をXMLとして生成し、それを使用できます。

9
Maxim Sloyko

私のかなり単純なケース(30テーブル、10000レコード)では、Perlスクリプトを使用しました。

http://pgfoundry.org/frs/?group_id=1000198

これはmysqlダンプファイルを操作してpgダンプファイルを生成しましたが、次の問題がありました。

私はHerokuにインポートしていたので、ほぼ完璧に機能するpgbackupsプラグインを使用しました。

注意すべき問題

  1. ブールデータ型。 MySQLはこれらを0と1として保存します。PostGreSQLはこれらをtとfとして保存します。ブール値が整数として移行されないことに注意してください。
  2. 自動インクリメントID。 IDが1から再びカウントを開始する場合があります。「重複するキー値が一意の制約に違反しています...」のようなエラーが発生します。修正は簡単ですが、注意してください。
8
superluminary

それよりも少し複雑です。ここにはたくさんのドキュメントがあります:

http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL

そこには、変換スクリプトもあります。

8

大きなMySQLデータベースをPostgresに変換するためにpy-mysql2pgsqlを使用しました。それはほとんどの場合を非常にうまく処理します。私は自分のニーズに固有のケースをいくつかパッチする必要がありました。

https://pypi.python.org/pypi/py-mysql2pgsql

デフォルトでは、MySQLからデータを読み取り、Postgresに書き込みます。しかし、Postgresにロードする前に検査するためにスキーマやデータをファイルに書き込むように要求することができます。

3

https://github.com/mihailShumilov/mysql2postgresql を使用できますPHPコンバーター

1
GodSon

Gitlabの作成者によって維持されている非常に素晴らしい(aのフォーク)pythonコンバーターもあります:

https://github.com/gitlabhq/mysql-postgresql-converter

元のフォークはこのプロジェクトが古くなっているためです。私にとって、すべてがこのスクリプトを使用して完全に機能しました。

0
panmari

ここには、現在のMySQLデータベースをいくつかのコマンドでPostgresqlに移行するプロジェクトがあり、インデックスと外部キーが含まれています。また、名前、インデックス、列タイプの解析を定義できるため、デフォルトの動作を上書きできます。

https://github.com/ggarri/mysql2psql

現在のプロジェクトをPGに移行することに興味がある人なら誰でも役に立つと思います。今回のケースでは、パフォーマンスが約20%向上しました。

0
Gabriel G.