4

MySQL から PostgreSQL にデータベースを移植しようとしています。Postgres でスキーマを再構築したので、テーブルを再作成せずにデータを取得するだけで済みます。

すべてのレコードを反復処理して一度に 1 つずつ挿入するコードを使用してこれを行うこともできますが、それを試してみたところ、データベースのサイズが遅くなるため、代わりに mysqldump と psql へのパイプを使用しようとしています (1 回につき 1 回)。動作するようになったら並列化する可能性があります)。

ここまでたどり着くには、さまざまなフープを飛び越えて、さまざまなフラグをオンまたはオフにして、漠然と正気なダンプを取得する必要がありました。繰り返しますが、データを取得するための空のスキーマを既に準備しているため、これは INSERT INTO のみをダンプします。

      /usr/bin/env \
      PGPASSWORD=mypassword \
      mysqldump \
      -h mysql-server \
      -u mysql-username \
      --password=mysql-password \
      mysql-database-name \
      table-name \
      --compatible=postgresql \
      --compact \
      -e -c -t \
      --default-character-set=utf8 \
      | sed "s/\\\\\\'/\\'\\'/g" \
      | psql \
      -h postgresql-server \
      --username=postgresql-username \
      postgresql-database-name

sedその醜いコマンド以外はすべて管理可能です。sedMySQL のアプローチを、文字列内の単一引用符を引用する ( 'O\'Connor') o PostgreSQL の引用要件 ( ) に変換しようと試みています'O''Connor'。ダンプに次のような文字列が含まれるまでは機能します: ... はい、この形式のユーザー入力がデータベースにあるようです。これは完全に有効ですが、コマンド'String ending with a backslash \\'を渡しません。sedコマンドに後読みを追加することもできますがsed、うさぎの穴に這い入っているような気がします。次のいずれかの方法はありますか:

a) 一重引用符を二重にして引用するように mysqldump に指示します b) バックスラッシュが引用エスケープとして解釈されることを期待するように psql に指示しますか?

との違いには別の問題がBINARYありbyteaますが、base64 エンコーディング/デコーディング フェーズでそれを回避しました。

編集 | (b) を で実行できるように見えますがset backslash_quote = on; set standard_conforming_strings = off;、それをパイプ出力の先頭に挿入する方法がわかりません。

4

3 に答える 3

3

mysqldump の--tabオプションを使用してテーブルを TSV にダンプし、psql のCOPY方法を使用してインポートします。

于 2012-09-02T14:04:16.907 に答える
1

これを試して:

sed -e "s/\\\\'/\\\\\\'/g" -e "s/\([^\\]\)\\\\'/\1\\'\\'/g"

そう、「つまようじ立て症候群」ですね。

于 2012-09-02T14:02:12.473 に答える