我使用 pg_dump
从 Postgres 9.4 中导出包含大对象 (LO) 的数据,如下所示:
$ pg_dump fhir -O -b > fhir.sql
我生成的fhir.sql
中的LO语句是这样的:
SET standard_conforming_strings = on;
SELECT pg_catalog.lowrite(0, '\x1f8b0800000000000000a5903b6ec3300c86efa2d9b1dad5a728daa2');
当我在我的 Postgres8.2 中执行 \i fhir.sql
时,我得到了这个错误:
ERROR: invalid input syntax for type bytea
当我 SET standard_conforming_strings = off
时,数据被插入,但我收到警告,我的 pg_largeobject
表中的数据是:
14 | 0 | \0378b0800000000000000a5903b6ec3300c86efa2d9b1dad5a728daa2
原来的\x1f
改成了\037
,我测试了一下,已经不是我原来的zip文件了……
我该如何解决这个问题?
更新:
我用Hibernate程序把同样的原始数据插入Greenplum(基于Postgresql8.2),然后用pg_dump
导出,它的格式是这样的:
SELECT pg_catalog.lowrite(0, '\\037\\213\\010\\000\\000\\000\\000\\000\\000\\000\\245\\220;n\\3030\\014')
最佳答案
问题是转储使用函数 pg_catalog.lowrite(integer, bytea)
来创建大对象,而 bytea
文字的默认语法是如何表示的PostgreSQL 在 9.0 版本中发生了变化。
有一个参数bytea_output
,可以设置为escape
,在PostgreSQL以后的版本中以旧格式输出bytea
。唉,pg_dump
在创建转储时不考虑该参数,它总是使用“新的”hex
格式。
结果是包含来自 PostgreSQL 9.0 或更高版本的大对象的转储无法恢复到 9.0 之前的数据库中。
您必须以其他方式转移这些大对象,可能是通过编写迁移程序。
您可以(在 pgsql-hackers 邮件列表上)向 pg_dump
提出一个选项,允许为转储设置 bytea_escape
,但您可能会遇到阻力,因为恢复不支持从较新的 PostgreSQL 版本转储到较旧的版本。
关于postgresql - 如何从Postgres 9.4转储大对象数据,然后导入到Postgres8.x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40993132/