postgresql - 如何从Postgres 9.4转储大对象数据,然后导入到Postgres8.x?

标签 postgresql blob greenplum

我使用 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/

相关文章:

postgresql - "SELECT count(dinstinct d.domain) WHERE r.rdns LIKE ' %' | r.rdns"的正确说法?

c++ - 关于 C++ 中 Blob 反模式的问题

php - 将原始(二进制?)图像数据插入mysql? (PHP)

java - maven intellij java mapreduce 测试程序

postgresql - 如何访问 postgresql 中的记录元素?

postgresql - 在 PostgreSQL 中选择字符串的值

postgresql - 为什么我的 Web 应用程序使用 ipv6 连接到本地 postgres

ruby-on-rails - 在 Rails 中禁用连接池以使用 PgBouncer

sql - 是否可以将 Sqlite Blob 列转换为十六进制字符串 (GUID)?

postgresql - 查看表的时间戳字段中有哪些唯一日期的最快方法?