「xxxx.sql」ダンプをMySQLからPostgreSQLデータベースにインポートするにはどうすればよいですか?
編集せずに動作することを期待しないでください。たぶん多くの編集。
mysqldumpには 互換性引数 、--compatible=name
、ここで「name」は「Oracle」または「postgresql」ですが、互換性を保証するものではありません。 ANSI_QUOTESのようなサーバー設定も効果があると思います。
ダンプの作成に使用した完全なコマンドと、「何も機能しませんでした」という代わりに表示されたエラーメッセージを含めると、さらに役立つヘルプが表示されます。
この質問は少し古いですが、数日前、私はこの状況に対処していました pgloader.io を見つけました。
これはこれを行う最も簡単な方法です。インストールしてから、次のように単純なLISPスクリプト(script.LISP)を実行する必要があります。 3行:
/* content of the script.LISP */
LOAD DATABASE
FROM mysql://dbuser@localhost/dbname
INTO postgresql://dbuser@localhost/dbname;
/*run this in the terminal*/
pgloader script.LISP
その後、postgresql DBには、MySQL SBにあったすべての情報が含まれます。
ちなみに、この投稿の時点でインストーラーにバグがあるため、pgloaderを必ずコンパイルしてください。 (バージョン3.2.0)
brew update && brew install pgloader
pgloader mysql://user@Host/db_name postgresql://user@Host/db_name
私が見つけた最速の(そして最も完全な)方法は、ケトルを使用することでした。これにより、必要なテーブルが生成され、インデックスやその他すべてが変換されます。 mysqldump
互換性引数はnot動作しません。
手順:
http://kettle.pentaho.org/ (コミュニティバージョン)からPentaho ETLをダウンロードします
Pentahoを解凍して実行します(unix/windowsに応じてspoon.sh/spoon.bat)
新しい仕事を作成する
MySQLソースのデータベース接続を作成します(ツール-> Wizard-> Create database connection)
PostgreSQLソースのデータベース接続を作成します(上記のとおり)
Copy Tables
ウィザード(ツール-> Wizard->テーブルのコピー)
ジョブを実行する
2015 +にいるGoogle社員向け。
これで一日中無駄になったので、まとめたいと思います。
this の記事Alexandru Cotioras(絶望に満ちている)で説明されているすべてのソリューションを試しました。言及されたすべてのソリューションの中で、私のために働いたのは1つだけでした。
— lanyrd/mysql-postgresql-converter @ github.com (Python)
しかし、これだけではできません。変換された新しいダンプファイルをインポートする場合:
# \i ~/Downloads/mysql-postgresql-converter-master/dump.psql
PostgreSQL
は、MySQL
の混乱したタイプについて通知します。
psql:/Users/jibiel/Downloads/mysql-postgresql-converter-master/dump.psql:381: ERROR: type "mediumint" does not exist
LINE 2: "group_id" mediumint(8) NOT NULL DEFAULT '0',
そのため、 this テーブルに従って、これらのタイプを手動で修正する必要があります。
要するに:
tinyint(2) -> smallint
mediumint(7) -> integer
# etc.
regex
とクールなエディターを使用してそれを実行できます。
MacVim
+ Substitute
:
:%s!tinyint(\w\+)!smallint!g
:%s!mediumint(\w\+)!integer!g
潜在的に MySQLからCSVにエクスポート してから CSVをPostgreSQLにインポート にすることができます。
Pgloaderを使用できます。
Sudo apt-get install pgloader
を使用して:
pgloader mysql://user:pass@Host/database postgresql://user:pass@Host/database
データを移行するためのこのbashスクリプトがあります。移行スクリプトで作成されるため、テーブルは作成されません。したがって、データを変換するだけで済みます。テーブルのリストを使用して、migrations
およびsessions
テーブルからデータをインポートしません。これは、テスト済みです。
#!/bin/sh
MUSER="root"
MPASS="mysqlpassword"
MDB="origdb"
MTABLES="car dog cat"
PUSER="postgres"
PDB="destdb"
mysqldump -h 127.0.0.1 -P 6033 -u $MUSER -p$MPASS --default-character-set=utf8 --compatible=postgresql --skip-disable-keys --skip-set-charset --no-create-info --complete-insert --skip-comments --skip-lock-tables $MDB $MTABLES > outputfile.sql
sed -i 's/UNLOCK TABLES;//g' outputfile.sql
sed -i 's/WRITE;/RESTART IDENTITY CASCADE;/g' outputfile.sql
sed -i 's/LOCK TABLES/TRUNCATE/g' outputfile.sql
sed -i "s/'0000\-00\-00 00\:00\:00'/NULL/g" outputfile.sql
sed -i "1i SET standard_conforming_strings = 'off';\n" outputfile.sql
sed -i "1i SET backslash_quote = 'on';\n" outputfile.sql
sed -i "1i update pg_cast set castcontext='a' where casttarget = 'boolean'::regtype;\n" outputfile.sql
echo "\nupdate pg_cast set castcontext='e' where casttarget = 'boolean'::regtype;\n" >> outputfile.sql
psql -h localhost -d $PDB -U $PUSER -f outputfile.sql
次のように安全に無視できる多くの警告が表示されます。
psql:outputfile.sql:82: WARNING: nonstandard use of escape in a string literal
LINE 1: ...,(1714,38,2,0,18,131,0.00,0.00,0.00,0.00,NULL,'{\"prospe...
^
HINT: Use the escape string syntax for escapes, e.g., E'\r\n'.
Oracle(バイナリ)ダンプをPostgreSQLにインポートすることはできません。
MySQLダンプがプレーンSQL形式の場合、ファイルを編集してPostgreSQLの構文を修正する必要があります(たとえば、非標準のバッククォートの引用を削除し、CREATE TABLEステートメントのエンジン定義を削除してデータ型を調整し、他のものの)
Mysqlデータベース(honey)のすべてのテーブルを作成してpostgresqlにロードする簡単なプログラムを次に示します。 mysqlからの型変換は粗粒度ですが、簡単に改良できます。インデックスを手動で再作成する必要があります。
import MySQLdb
from magic import Connect #Private mysql connect information
import psycopg2
dbx=Connect()
DB=psycopg2.connect("dbname='honey'")
DC=DB.cursor()
mysql='''show tables from honey'''
dbx.execute(mysql); ts=dbx.fetchall(); tables=[]
for table in ts: tables.append(table[0])
for table in tables:
mysql='''describe honey.%s'''%(table)
dbx.execute(mysql); rows=dbx.fetchall()
psql='drop table %s'%(table)
DC.execute(psql); DB.commit()
psql='create table %s ('%(table)
for row in rows:
name=row[0]; type=row[1]
if 'int' in type: type='int8'
if 'blob' in type: type='bytea'
if 'datetime' in type: type='timestamptz'
psql+='%s %s,'%(name,type)
psql=psql.strip(',')+')'
print psql
try: DC.execute(psql); DB.commit()
except: pass
msql='''select * from honey.%s'''%(table)
dbx.execute(msql); rows=dbx.fetchall()
n=len(rows); print n; t=n
if n==0: continue #skip if no data
cols=len(rows[0])
for row in rows:
ps=', '.join(['%s']*cols)
psql='''insert into %s values(%s)'''%(table, ps)
DC.execute(psql,(row))
n=n-1
if n%1000==1: DB.commit(); print n,t,t-n
DB.commit()
pgloader
でpgloader
;の最新バージョンを取得します。 Debian Jessieが提供するもの(2019-01-27現在)は3.1.0であり、 動作しませんpgloader
は
Can not find file mysql://...
Can not find file postgres://...
まず、MySQLを実行しているサーバーでmysqld
への接続を確立できることを確認してください。
telnet theserverwithmysql 3306
それが失敗した場合
名前またはサービスが不明です
theserverwithmysql
にログインし、mysqld
の構成ファイルを編集します。設定ファイルの場所がわからない場合は、find / -name mysqld.cnf
を使用します。
私の場合、mysqld.cnf
のこの行を変更する必要がありました
# By default we only accept connections from localhost
bind-address = 127.0.0.1
に
bind-address = *
すべてのアドレスからMySQLデータベースへのアクセスを許可すると、セキュリティリスクが発生する可能性があることに注意してください。つまり、データベースの移行後にその値を変更する必要がある可能性があります。
mysqld
を再起動して、mysqld.cnf
への変更を有効にします。
Postgresを実行するシステムにログインしていると仮定して、データベースを作成します
createdb databasename
Postgresデータベースのユーザーには、スキーマを作成するための十分な権限が必要です。そうでない場合は、
データベースdatabasenameの許可が拒否されました
pgloader
を呼び出すとき。ユーザーにはpsql > \du
に従ってデータベースを作成する権限がありますが、このエラーが発生しました。
psql
で確認できます:
GRANT ALL PRIVILEGES ON DATABASE databasename TO otherusername;
繰り返しますが、これは特権を過剰に使用する可能性があるため、これらの特権をすべてユーザーotherusername
のままにしておくと、セキュリティ上のリスクが生じる可能性があります。
最後に、コマンド
pgloader mysql://theusername:thepassword@theserverwithmysql/databasename postgresql://otherusername@localhost/databasename
postgresを実行しているマシンで実行すると、次のような行で終わる出力が生成されます。
Total import time ✓ 877567 158.1 MB 1m11.230s
Mac/Win
Navicat試用版を14日間ダウンロードします(1300ドルがわかりません)-完全なエンタープライズパッケージ:
データベースmysqlとpostgresの両方を接続します
メニュー-ツール-データ転送
この最初の画面で両方のデータベースを接続します。この画面にいる間、一般的な/オプションがあります-右側のチェックのオプションチェックの下-エラーで続行*左のインデックスとキーのチェックを外したいことに注意してください.postgresで簡単に再割り当てできます。
少なくともMySQLからPostgresにデータを取得してください!
お役に立てれば!
ほとんどのデータベースの移行と同様に、実際にはカットアンドドライソリューションはありません。
これらは、移行を行うときに留意すべきいくつかのアイデアです。
これらに留意してください。最善の方法は、おそらく変換ユーティリティを作成することです。幸せな転換を!
SQuirreL SQL Client用DBCopyプラグイン を使用して、MySQLからPostgresにテーブルをコピーできました。これはダンプからではなく、ライブデータベース間で発生しました。
Xxx.sqlファイルを使用してMySQLデータベースをセットアップし、 FromMysqlToPostrgreSQL を使用します。非常に使いやすく、短い構成で、チャームのように機能します。設定された主キー、外部キー、テーブルのインデックスを使用してデータベースをインポートします。構成ファイルに適切なフラグを設定すると、データのみをインポートすることもできます。
Anatoly KhaytovichによるFromMySqlToPostgreSql移行ツールは、テーブルデータ、インデックス、PK、FKの正確な移行を提供します。PostgreSQLCOPYプロトコルを広範囲に使用します。
こちらもご覧ください: PG Wikiページ
最近、サイズが約7 GBの多くの大きな.sqlファイルに対してこれを行う必要がありました。でもVIMはそれらを編集するのが面倒でした。最善の策は、.sqlをMySqlにインポートし、それをPostgresにインポートできるcsvとしてエクスポートすることです。
ただし、csvとしてのMySQLエクスポートは、select * from yourtableクエリを実行するため、非常に遅くなります。大きなデータベース/テーブルがある場合は、他の方法を使用することをお勧めします。 1つの方法は、sqlを1行ずつ挿入し、文字列操作を使用して「Postgres準拠」の挿入ステートメントに再フォーマットし、Postgresでこれらのステートメントを実行するスクリプトを記述することです。