私のPostgreSQLはWindowsにインストールされています。 MySQLデータベースからPostgreSQLにデータを移行するにはどうすればよいですか?私はたくさんのariclesを読みました。何も役に立たない:(
ありがとう。
私の行動:
mysqlダンプ:
mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
pgsqlでdbシンクロナイザーを作成する
インポートダンプ:
psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
出力:
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','','???????? ...
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として生成し、それを使用できます。
私のかなり単純なケース(30テーブル、10000レコード)では、Perlスクリプトを使用しました。
http://pgfoundry.org/frs/?group_id=1000198
これはmysqlダンプファイルを操作してpgダンプファイルを生成しましたが、次の問題がありました。
私はHerokuにインポートしていたので、ほぼ完璧に機能するpgbackupsプラグインを使用しました。
それよりも少し複雑です。ここにはたくさんのドキュメントがあります:
http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL
そこには、変換スクリプトもあります。
大きなMySQLデータベースをPostgresに変換するためにpy-mysql2pgsqlを使用しました。それはほとんどの場合を非常にうまく処理します。私は自分のニーズに固有のケースをいくつかパッチする必要がありました。
https://pypi.python.org/pypi/py-mysql2pgsql
デフォルトでは、MySQLからデータを読み取り、Postgresに書き込みます。しかし、Postgresにロードする前に検査するためにスキーマやデータをファイルに書き込むように要求することができます。
https://github.com/mihailShumilov/mysql2postgresql を使用できますPHPコンバーター
Gitlabの作成者によって維持されている非常に素晴らしい(aのフォーク)pythonコンバーターもあります:
https://github.com/gitlabhq/mysql-postgresql-converter
元のフォークはこのプロジェクトが古くなっているためです。私にとって、すべてがこのスクリプトを使用して完全に機能しました。
ここには、現在のMySQLデータベースをいくつかのコマンドでPostgresqlに移行するプロジェクトがあり、インデックスと外部キーが含まれています。また、名前、インデックス、列タイプの解析を定義できるため、デフォルトの動作を上書きできます。
https://github.com/ggarri/mysql2psql
現在のプロジェクトをPGに移行することに興味がある人なら誰でも役に立つと思います。今回のケースでは、パフォーマンスが約20%向上しました。