12

我有一个运行 PostgreSQL v9.0 的(生产)数据库服务器和一个运行 PostgreSQL v8.4 的开发机器。我想转储生产数据库并在开发机器上使用它。我无法升级开发机器上的 postgres。

在生产机器上,我运行:

pg_dump -f nvdls.db -F p -U nvdladmin nvdlstats

在开发机器上,我运行:

pg_restore -d nvdlstats -U nvdladmin nvdls.db

我得到了这个错误:

pg_restore: [archiver] unsupported version (1.12) in file header

无论我在转储时选择自定义、tar 还是纯文本格式,都会发生这种情况。

我在网上找到了一个讨论,建议我应该pg_restore在开发机器上使用更新版本的。我通过简单地将 9.0 二进制文件复制到开发机器来尝试此操作,但由于链接问题而失败(并非意外)。

我认为使用纯文本转储的目的在于它是原始的、可移植的 SQL。显然不是。

如何将 9.0 DB 安装到我的 8.4 安装中?

4

5 回答 5

29

pg_restore用于恢复以“自定义”格式获取的转储。

如果您执行“纯文本”转储,则必须使用 psql 运行生成的 SQL 脚本:

psql -f nvdls.db dbname 用户名 
于 2011-01-05T00:30:22.897 回答
5

不支持使用 pg_dump/pg_restore 从 9.0 移动到 8.4 - 仅支持向前移动。

但是,您通常可以获取数据(在仅数据转储中),并且在某些情况下您可以获取架构 - 但这主要是运气,这取决于您使用的功能。

您通常应该使用 pg_dump 和 pg_restore 的目标版本 - 这意味着在这种情况下您应该使用 8.4 中的二进制文件。但是你应该使用相同版本的 pg_dump 和 pg_restore。这两种工具都可以在网络上正常工作,因此不需要复制二进制文件。

正如 a_horse_with_no_name 所说,在纯文本模式下使用 pg_dump 可能会更好——这将允许您在必要时手动编辑转储。特别是,您可以制作一个仅模式转储(使用 -s)和一个仅数据转储 - 只有模式转储可能需要任何编辑。

于 2011-01-05T16:01:33.180 回答
2

我通过将 postgresql 从 8.X 升级到 9.2.4 解决了这个问题。如果您在 Mac OS-X 上使用 brew,请使用 -

brew upgrade postgresql

完成此操作后,只需确保您的新 postgres 安装位于路径的顶部。它看起来像(取决于版本安装路径) -

export PATH=/usr/local/Cellar/postgresql/9.2.4/bin:$PATH
于 2013-08-09T23:05:12.333 回答
2

如果 9.0 数据库包含任何 bytea 列,那么更大的问题正在等待。

这些列将由 pg_dump 使用“十六进制”表示形式导出,并出现在您的转储文件中,例如:

选择 pg_catalog.lowrite(0, '\x0a2')

任何低于 9.0 的 postgres 后端版本都无法理解 bytea 的十六进制表示,而且我找不到告诉 9.0 端的 pg_dump 不使用它的选项。pg_dump 似乎忽略了将数据库或整个服务器的默认“bytea_output”设置为 ESCAPE。

我想可以对转储文件进行后处理并将每个十六进制编码的 bytea 值更改为转义值,但是无法追踪损坏通常存储在 bytea 中的东西(图像、PDF 等)的风险不会令我兴奋,...令我高兴,...令我感兴趣。

于 2011-05-25T14:41:26.440 回答
0

我有同样的问题。我将 pgdump 和 psql 用于导出/导入数据库。

1.设置PGPASSWORD

export PGPASSWORD='h0ld1tn0w';

2.使用 pg_dump 导出数据库

pg_dump -h <<host>> -U <<username>> <<dbname>> > /opt/db.out 

/opt/db.out 是转储路径。你可以自己指定。

3.然后再次设置你另一个主机的PGPASSWORD。如果主机相同或密码相同,则不需要。

4.在您的另一台主机上导入数据库

psql -h <<host>> -U <<username>> -d <<dbname>> -f /opt/db.out

如果用户名不同,则在 db.out 文件中查找并替换为您的本地用户名。并确保用户名被替换而不是数据。

于 2016-10-19T08:20:37.163 回答