如何将大型 blob 表从 mysql 迁移到 postgresql?

Ser*_*sev 15 mysql postgresql migration

我现在正在将我的 MySQL 数据库迁移到 PostgreSQL。除了我拥有的一张表 - 实际上是我的应用程序中最重要的表之外,几乎一切都很好(好吧,经过大量谷歌搜索以获取正确的 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
Run Code Online (Sandbox Code Playgroud)

但它非常大(> 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
Run Code Online (Sandbox Code Playgroud)

psql 会话:

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

\i 'path/to/pg.dump'
Run Code Online (Sandbox Code Playgroud)