web-dev-qa-db-ja.com

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

現在、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

しかしvery大きい(> 20 Gb)。

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

この件についてアドバイスをいただければ幸いです。カスタム移行ツールを作成することは悪い考えではないと思い始めています...

14

最も簡単な方法は、その_--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'
_
12