大きなblobテーブルをmysqlからpostgresqlに移行する方法は?


14

現在、MySQLデータベースをPostgreSQLに移行しています。私が持っている1つのテーブル-実際には私のアプリで最も重要なテーブルを除いて、ほとんどすべてがうまくいきました(まあ、正しいmysqldumpパラメータなどのためにたくさんのグーグルをした後)。

テーブル構造は非常に単純です。

mysql> show create table samples;
.. skipped ...
CREATE TABLE `samples` (
      `File_ID` int(11) NOT NULL,
      `File` longblob,
      PRIMARY KEY (`File_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=binary

ただし、非常に大きい(> 20 Gb)。

mysqldumpの--hex-blobパラメーターを使用しようとしましたが、結果のダンプファイルをコマンドファイルとして使用しようとすると、この形式のデータはPostgreSQLで受け入れられません。私が試した別のオプションは、-tabオプションを使用してダンプを取得し、COPYコマンドでPostgreSQLに挿入することです-しかし、-hex-blobは--tabで動作せず、PostgreSQLはまだダンプファイルを受け入れません無効な文字です。

この問題に関してアドバイスをいただければうれしいです-カスタム移行ツールを書くことは結局悪い考えではないと思い始めていますが...


最後に確認したところ、PostgreSQLのdblinkは他のPostgreSQLインスタンスにしか接続できませんでした。MySQL Proxyはこれ以上優れているとは思いません。... PostgreSQLのに挿入するために、MySQLのからの読み取りに:(などのJava、IE)あなたの好きな言語を使用する必要があるかもしれません

@OMG:私が問題に気づいたように、私はこの道を行く準備がほぼできています-誰かがこの問題について何かを知っているというわずかな希望があります。

pgsqlの最後にどのデータ型を挿入しようとしていますか?私は自分でbyteaをします。

@スコット:はい、もちろんバイテです。

2
bytea型のためposgresql 9をサポート六角構文直接、こちらを参照してください。postgresql.org/docs/9.0/interactive/...(あなたはかかわらのsedのビットが必要です)

回答:


12

私は、最も簡単な方法は、その--hex-blobスイッチを使用しmysqldumpてpsqlで復元することだと思いますdecode(string text, type text)。ただし、少し生成されたダンプ(sed、awk)を変更し、そのデコード機能を追加する必要があるため、それほど単純ではありません。例えば:

mysqldump -u root -p --skip-quote-names --hex-blob --skip-triggers \
    --compact --no-create-info mysql samples > prepg.dump

sed "s/0x\([0-9,A-F]*\))/decode('\1','hex'))/g" prepg.dump > pg.dump

psqlセッション:

CREATE TABLE samples
(
    file_id integer PRIMARY KEY,
    file bytea
);

\i 'path/to/pg.dump'

Grzegorz、提案をありがとう、これを試して結果を報告します。

チャームのように機能しました:)正しくインポートされた10個のファイルをテストします。すべてのチェックサムは元のファイルと一致しています。どうもありがとうございました!

1
他のフィールドがある場合、コンマまたは末尾の括弧と一致させたくないでしょう。これは動作するはずです:sed "s/0x\([0-9A-F]*\)/decode('\1','hex')/g" prepg.dump > pg.dump
tjmcewan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.