web-dev-qa-db-ja.com

MySQLダンプをPostgreSQLデータベースにインポートする

「xxxx.sql」ダンプをMySQLからPostgreSQLデータベースにインポートするにはどうすればよいですか?

50
Palani Kannan

編集せずに動作することを期待しないでください。たぶん多くの編集。

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)

39
Rob Contreras

Mac OS X

brew update && brew install pgloader

pgloader mysql://user@Host/db_name postgresql://user@Host/db_name
13
kyo

私が見つけた最速の(そして最も完全な)方法は、ケトルを使用することでした。これにより、必要なテーブルが生成され、インデックスやその他すべてが変換されます。 mysqldump互換性引数はnot動作しません。

手順:

  1. http://kettle.pentaho.org/ (コミュニティバージョン)からPentaho ETLをダウンロードします

  2. Pentahoを解凍して実行します(unix/windowsに応じてspoon.sh/spoon.bat)

  3. 新しい仕事を作成する

  4. MySQLソースのデータベース接続を作成します(ツール-> Wizard-> Create database connection)

  5. PostgreSQLソースのデータベース接続を作成します(上記のとおり)

  6. Copy Tablesウィザード(ツール-> Wizard->テーブルのコピー)

  7. ジョブを実行する

10
Wolph

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
10
jibiel

潜在的に MySQLからCSVにエクスポート してから CSVをPostgreSQLにインポート にすることができます。

7
WhiteFang34

Pgloaderを使用できます。

Sudo apt-get install pgloader

を使用して:

pgloader mysql://user:pass@Host/database postgresql://user:pass@Host/database
6
Frederik Witte

データを移行するためのこの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'.
5
Nicolay77

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()
2
anon

pgloader

pgloader;の最新バージョンを取得します。 Debian Jessieが提供するもの(2019-01-27現在)は3.1.0であり、 動作しませんpgloader

Can not find file mysql://...
Can not find file postgres://...

MySQLソースへのアクセス

まず、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ターゲットの準備

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
2
Matthias Braun

Mac/Win

Navicat試用版を14日間ダウンロードします(1300ドルがわかりません)-完全なエンタープライズパッケージ:

データベースmysqlとpostgresの両方を接続します

メニュー-ツール-データ転送

この最初の画面で両方のデータベースを接続します。この画面にいる間、一般的な/オプションがあります-右側のチェックのオプションチェックの下-エラーで続行*左のインデックスとキーのチェックを外したいことに注意してください.postgresで簡単に再割り当てできます。

少なくともMySQLからPostgresにデータを取得してください!

お役に立てれば!

1
Bo Opfer

ほとんどのデータベースの移行と同様に、実際にはカットアンドドライソリューションはありません。

これらは、移行を行うときに留意すべきいくつかのアイデアです。

  1. データ型は一致しません。ある人は、そうでない人もいます。たとえば、SQL Serverビット(ブール型)にはOracleに相当するものがありません。
  2. 主キーシーケンスは、データベースごとに異なる方法で生成されます。
  3. 外部キーは新しいシーケンスを指します。
  4. インデックスは異なり、おそらく微調整が必​​要になります。
  5. ストアドプロシージャはすべて書き換える必要があります。
  6. スキーマ。 Mysqlはそれらを使用しません(少なくとも私が使用して以来)。Postgresqlは使用します。すべてをパブリックスキーマに入れないでください。これは悪い習慣ですが、MysqlとPostgresqlをサポートするほとんどのアプリ(Djangoが思い浮かぶ)は、パブリックスキーマを使用しようとします。
  7. データ移行。古いデータベースのすべてを新しいデータベースに挿入する必要があります。これは、主キーと外部キーを無効にし、データを挿入してから有効にすることを意味します。また、新しいシーケンスはすべて、各テーブルで最も高いIDにリセットする必要があります。そうでない場合、挿入される次のレコードは主キー違反で失敗します。
  8. 新しいデータベースで動作するようにコードを書き換えます。動作するはずですが、おそらく動作しません。
  9. トリガーを忘れないでください。ほとんどのテーブルで作成および更新の日付トリガーを使用しています。各データベースはそれらを少し異なる場所に配置します。

これらに留意してください。最善の方法は、おそらく変換ユーティリティを作成することです。幸せな転換を!

1
Doug

SQuirreL SQL Client用DBCopyプラグイン を使用して、MySQLからPostgresにテーブルをコピーできました。これはダンプからではなく、ライブデータベース間で発生しました。

0
weberjn

Xxx.sqlファイルを使用してMySQLデータベースをセットアップし、 FromMysqlToPostrgreSQL を使用します。非常に使いやすく、短い構成で、チャームのように機能します。設定された主キー、外部キー、テーブルのインデックスを使用してデータベースをインポートします。構成ファイルに適切なフラグを設定すると、データのみをインポートすることもできます。

Anatoly KhaytovichによるFromMySqlToPostgreSql移行ツールは、テーブルデータ、インデックス、PK、FKの正確な移行を提供します。PostgreSQLCOPYプロトコルを広範囲に使用します。

こちらもご覧ください: PG Wikiページ

0
swedge218

最近、サイズが約7 GBの多くの大きな.sqlファイルに対してこれを行う必要がありました。でもVIMはそれらを編集するのが面倒でした。最善の策は、.sqlをMySqlにインポートし、それをPostgresにインポートできるcsvとしてエクスポートすることです。

ただし、csvとしてのMySQLエクスポートは、select * from yourtableクエリを実行するため、非常に遅くなります。大きなデータベース/テーブルがある場合は、他の方法を使用することをお勧めします。 1つの方法は、sqlを1行ずつ挿入し、文字列操作を使用して「Postgres準拠」の挿入ステートメントに再フォーマットし、Postgresでこれらのステートメントを実行するスクリプトを記述することです。

0
Shreyas Chavan