使用pg_restore从较新的PostgreSQL版本进行恢复

12
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个运行PostgreSQL v9.0的(生产)DB服务器和一个运行PostgreSQL v8.4的开发机器。我想将生产DB的转储文件导入到开发机器上使用。我不能升级dev机器上的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 或 plain_text 格式)进行转储,都会出现这种情况。
我在网上找到了一个讨论,建议在开发机器上使用更新版本的 pg_restore。我试图通过将 9.0 二进制文件简单地复制到开发机器上来实现这一点,但由于链接问题而失败(预料之中)。
我认为使用纯文本转储的重点是它应该是原始的、可移植的 SQL。显然不是这样。
如何将 9.0 数据库导入到我的 8.4 安装中?

您可以同时运行8.4和9.0版本(这就是我正在做的,它可以正常工作),这样您就可以将8.4用于依赖它的本地项目,而又能使用9.0处理需要该版本的某个应用程序。从长远来看,这比尝试从不同版本还原转储更加划算。 - wildpeaks
使用pgAdmin III导出和导入PostgreSQL - Somnath Muluk
5个回答

29

pg_restore仅用于恢复以"custom"格式拍摄的转储。

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

psql -f nvdls.db dbname username 

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),以及仅数据备份 - 只有模式备份可能需要进行任何编辑。


将模式与数据分开转储的建议很好。使用 plain_text 时确实出现了一些错误,但都可以恢复。我无法在开发机器上尝试使用 pg_dump,因为生产服务器配置为禁止远程连接,但这也听起来很有前途。 - Phrogz
1
只要您有使用SSH端口转发(或类似)的能力,就可以远程使用它。 - Magnus Hagander

2
如果9.0数据库包含任何bytea列,则将面临更大的问题。
这些列将使用“hex”表示法由pg_dump导出,并在转储文件中显示为:
SELECT pg_catalog.lowrite(0, '\x0a2')
任何低于9.0版本的postgres后端都无法理解bytea的十六进制表示,我找不到一个选项告诉9.0端的pg_dump不要使用它。将默认的“bytea_output”设置为ESCAPE对于数据库或整个服务器而言,似乎被pg_dump忽略了。
我想可能可以对转储文件进行后处理,并实际更改每个十六进制编码的bytea值为转义值,但是这样做会冒着不可追踪地破坏通常存储在bytea中的东西(图片、PDF等)的风险,这并不让人兴奋。

至少在9.2.2版本中,bytea_output设置现在对pg_dump有效,因此将其设置为“escape”将生成一个兼容8.4版本的转储文件,至少对于bytea字段是这样。但是仍然会收到有关过程的一些警告。 - jishi

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

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文件中查找并替换为本地用户名。确保只替换用户名而不是数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接