如何将大型Blob表从mysql迁移到Postgresql?


14

我现在正在将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

但它非常大(> 20 Gb)。

我尝试使用mysqldump的--hex-blob参数-但是当我尝试将生成的转储文件用作命令文件时,PostgreSQL不接受这种格式的数据。我尝试过的另一个选项是使用--tab选项只是获取转储,然后使用COPY命令将其插入到PostgreSQL中-但是--hex-blob无法与--tab一起使用,并且PostgreSQL仍然不接受在那说的转储文件是无效字符。

我很高兴收到关于此事的任何建议-尽管我开始认为编写自定义迁移工具毕竟不是一个坏主意...


最后我检查了一下,PostgreSQL的dblink只能连接到其他PostgreSQL实例。我认为MySQL Proxy不会更好。您可能需要使用自己喜欢的语言(IE:Java等)从MySQL中读取信息,以便插入到PostgreSQL中……

@OMG:正如我已经注意到的那样,我几乎已经准备好采用这种方式-只是希望有人希望对此事有所了解。

您想将哪种数据类型插入pgsql?我自己做bytea。

@斯科特:是的,当然是bytea。

2
posgresql 9直接支持bytea的十六进制语法,请参见此处:postgresql.org/docs/9.0/interactive/…(不过您需要一些sed)

Answers:


12

我认为最简单的方法是通过psql 使用该--hex-blob开关mysqldump并进行还原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 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.