18

はるか昔、はるか遠くのシステムで...

データベースをMySQLからPostgreSQLに移行しようとしています。私が読んだすべてのドキュメントは、構造を移行する方法を非常に詳細にカバーしています。データの移行に関するドキュメントはほとんど見つかりませんでした。スキーマには、13個のテーブル(正常に移行されました)と9GBのデータがあります。

MySQLバージョン:5.1.x
PostgreSQLバージョン:8.4.x

Rプログラミング言語を使用して、SQLselectステートメントを使用してデータを分析したいと思います。PostgreSQLにはPL/Rがありますが、MySQLには何もありません(私が知る限り)。

新たな希望

データベースの場所を作成します(/var十分なスペースがありません。また、PostgreSQLのバージョン番号をどこにでも置くことは嫌いです。アップグレードするとスクリプトが壊れます!):

  1. sudo mkdir -p /home/postgres/main
  2. sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
  3. sudo chown -R postgres.postgres /home/postgres
  4. sudo chmod -R 700 /home/postgres
  5. sudo usermod -d /home/postgres/ postgres

ここまですべて良い。次に、サーバーを再起動し、次のインストール手順を使用してデータベースを構成します。

  1. sudo apt-get install postgresql pgadmin3
  2. sudo /etc/init.d/postgresql-8.4 stop
  3. sudo vi /etc/postgresql/8.4/main/postgresql.conf
  4. data_directoryに変更/home/postgres/main
  5. sudo /etc/init.d/postgresql-8.4 start
  6. sudo -u postgres psql postgres
  7. \password postgres
  8. sudo -u postgres createdb climate
  9. pgadmin3

pgadmin3データベースを構成し、スキーマを作成するために使用します。

エピソードは、と呼ばれるリモートシェルで続行されbash、両方のデータベースが実行され、かなり珍しいロゴが付いた一連のツール(SQL Fairy )がインストールされます。

  1. perl Makefile.PL
  2. sudo make install
  3. sudo apt-get install perl-doc(不思議なことに、それは呼ばれていませんperldoc
  4. perldoc SQL::Translator::Manual

PostgreSQL対応のDDLとすべてのMySQLデータを抽出します。

  1. sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
  2. 識別子を編集climate-pg-ddl.sqlして小文字に変換し、スキーマ参照を挿入します(VIMを使用)。
    • :%s/"\([A-Z_]*\)"/\L\1/g
    • :%s/ TABLE / TABLE climate./g
    • :%s/ on / on climate./g
  3. mysqldump --skip-add-locks --complete-insert --no-create-db --no-create-info --quick --result-file="climate-my.sql" --databases climate --skip-comments -u root -p

MySQLのテーブルと列の名前を小文字に変更するだけの価値があるかもしれません。

  1. select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
  2. 前の手順のコマンドを実行します。
  3. おそらく、列に対して同じことを行う方法があります。クエリの書き方を理解するよりも速かったので、手動で変更しました。

データベースの逆襲

次のようにPostgreSQLで構造を再作成します。

  1. pgadmin3(それに切り替えます)
  2. [任意のSQLクエリを実行する]アイコンをクリックします
  3. 開けるclimate-pg-ddl.sql
  4. TABLE "置換を検索しTABLE climate."ます(スキーマ名を挿入しますclimate
  5. on "置換を検索しon climate."ます(スキーマ名を挿入しますclimate
  6. を押しF5て実行

これにより、次のようになります。

Query returned successfully with no result in 122 ms.

ジェダイの返信

この時点で私は困惑しています。

  • PostgreSQLに対して実行できるように変換するためにここからどこに行くのですか(手順は何ですか)?climate-my.sqlclimate-pg.sql
  • インデックスが正しくコピーされていることを確認するにはどうすればよいですか(参照整合性を維持するため。現時点では、移行を容易にするための制約はありません)。
  • PostgreSQLに新しい行を追加すると、最後に挿入された行のインデックスから列挙が開始されるようにするにはどうすればよいですか(シーケンスの既存の主キーと競合しないようにするため)。
  • データをMySQLからPostgreSQLインサートに変換するときに、スキーマ名が確実に伝わるようにするにはどうすればよいですか?

資力

これを実現するには、かなりの情報が必要でした。

ありがとうございました!

4

4 に答える 4

4

このような移行のために私が通常行うことは2つあります。

  • MySQLからデータベース定義全体を抽出し、PostgreSQL構文に適合させます。
  • データベース定義に目を通し、MySQLには存在しないPostgreSQLの機能を利用するように変換します。

次に、変換を行い、次のことを実現する最も使いやすい言語でプログラムを作成します。

  • MySQLデータベースからデータを読み取ります。
  • PostgreSQLデータベースに保存されるデータに対して必要な変換を実行します。
  • 変換されたデータをPostgreSQLデータベースに保存します。

PostgreSQLの機能を利用するために、テーブルを再設計します。

スクリプトを使用してSQLダンプをある形式から次の形式に変換するようなことを行う場合sedは、MySQLデータベースをPostgreSQLサーバーに配置するだけです。あなたはそれを行うことができます、そしてそうすることからまだいくらかの利益があります、しかしあなたが移行するつもりなら、完全に移行してください。

少し前もって時間を費やす必要がありますが、それだけの価値がない状況にはまだ遭遇していません。

于 2010-05-14T03:53:44.493 に答える
2

mysqldumpファイルをPostgreSQLに適した形式に変換します

次のようにデータを変換します( mysql2pgsql.perlは使用しないでください)。

  1. 引用符をエスケープします。

    sed "s/\\\'/\'\'/g" climate-my.sql | sed "s/\\\r/\r/g" | sed "s/\\\n/\n/g" > escaped-my.sql

  2. を検索パスに置き換え、USE "climate";コメントにコメントを付けます。

    sed "s/USE \"climate\";/SET search_path TO climate;/g" escaped-my.sql | sed "s/^\/\*/--/" > climate-pg.sql

  3. データベースに接続します。

    sudo su - postgres
    psql climate

  4. エンコーディングを設定し(mysqldumpはそのエンコーディングパラメータを無視します)、スクリプトを実行します。

    \encoding iso-8859-1
    \i climate-pg.sql

この一連の手順は、多くの混合タイプを持つ複雑なデータベースではおそらく機能しません。ただし、integers、varchars、およびfloatsでは機能します。

インデックス、主キー、およびシーケンス

mysqldumpステートメントの生成時に主キーが含まれているためINSERT、テーブルの自動シーケンスよりも優先されます。すべてのテーブルのシーケンスは、検査時に1のままでした。

インポート後のシーケンスを設定する

コマンドを使用すると、ALTER SEQUENCE必要な値に設定されます。

スキーマプレフィックス

テーブルの前にスキーマ名を付ける必要はありません。使用する:

SET search_path TO climate;
于 2010-05-14T02:31:15.080 に答える
2

スキーマを変換した場合、データの移行は簡単です。

  • PostgreSQLからスキーマをダンプします(スキーマをpostgresに変換したとのことですが、ターゲットデータベースを削除して再作成し、クリーンアップするため、今のところスキーマをダンプします):

    pg_dump dbname> /tmp/dbname-schema.sql
    
  • スキーマを2つの部分に分割します— /tmp/dbname-schema-1.sqlcreate tableステートメントを含みます/tmp/dbname-schema-2.sql—残り。PostgreSQLは、外部キーやトリガーなどをインポートする前にデータをインポートする必要がありますが、テーブル定義をインポートした後です。

  • スキーマの一部のみを使用してデータベースを再作成します。

    データベースdbnameを削除します
    データベースdbnameを作成します
    \ i /tmp/dbname-schema-1.sql
    -これで、データ、トリガー、外部キーなどのないテーブルができました。
    
  • データのインポート:

    ((
       echo'トランザクションの開始';
       mysqldump --skip-quote-names dbname | grep ^ INSERT;
       エコー'コミット'
    )| psql dbname
    -これで、データはあるがトリガーや外部キーなどがないテーブルができました。
    

    MySQL 5.1.3にオプションが追加されている--skip-quote-namesため、古いバージョンを使用している場合は、新しいmysqlを一時的にインストールして/tmp/mysqlconfigure --prefix=/tmp/mysql && make install実行する必要があります)、を使用します/tmp/mysql/bin/mysqldump

  • 残りのスキーマをインポートします。

    psql dbname
    トランザクションを開始します
    \ i /tmp/dbname-schema-2.sql
    専念
    -  終わったね
    
于 2010-05-14T18:06:37.327 に答える
0

etlalchemyをチェックしてください。4行のPythonで、MySQLからPostgreSQLに、または他のいくつかのデータベース間で移行できます。あなたはここでそれについてもっと読むことができます。

インストールするには:pip install etlalchemy

走る:

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget
# Migrate from MySQL to PostgreSQL
src = ETLAlchemySource("mysql://user:passwd@hostname/dbname")
tgt = ETLAlchemyTarget("postgresql://user:passwd@hostname/dbname",
                          drop_database=True)
tgt.addSource(src)
tgt.migrate()
于 2016-07-22T14:08:32.320 に答える