跨不同主要 PostgreSQL 版本的 pg_dump 和 pg_restore

kli*_*ron 13 postgresql

我的开发机器(称为 D)运行 PostgreSQL 9.4.5。我的生产机器(称之为 P)运行 PostgreSQL 8.4.20。

我不使用 PostgreSQL 9.x 中的任何新功能或类型。

有时我需要在 D 上镜像 P 的状态,有时我需要做相反的事情。在这两种情况下,我都使用 pg_dump/pg_restore。

当我从 P 转储恢复到 D 时,我从来没有出现任何错误或警告。但是,当我做相反的事情时,我会遇到多个unrecognized configuration parameter "lock_timeout"错误。我知道这个配置参数是在 9.3 中引入的,由于恢复过程的其余部分工作正常,我只是忽略错误消息。

我的问题是:在不同的主要版本中使用 pg_dump/pg_restore 是一个坏主意,还是可以像我在这里所做的那样安全地忽略兼容性错误?我将来会被这个咬吗?我无法升级 P,为了安全起见,我应该将 D 降级到 8.4.20 吗?

小智 16

正如 PostgreSQL 文档(https://www.postgresql.org/docs/14/app-pgdump.html)所述:

\n
\n

由于 pg_dump 用于将数据传输到较新版本的 PostgreSQL,因此 pg_dump 的输出预计会加载到比 pg_dump 版本更新的 PostgreSQL 服务器版本中。pg_dump 还可以从比其自身版本更旧的 PostgreSQL 服务器转储。(目前,支持版本 8.0 的服务器。)但是,pg_dump 无法从比其主要版本更新的 PostgreSQL 服务器转储;它甚至会拒绝尝试,而不是冒险进行无效转储。此外,不保证 pg_dump\ 的输出可以加载到旧主要版本 \xe2\x80\x94 的服务器中,即使转储是从该版本的服务器获取的。

\n
\n

因此,对于仍然对此有疑问的其他人来说,不能保证从 PgSQL 服务器较新版本中,您对旧版本有 100% 的工作输出。但相反,效果会很好。

\n

建议使用生产服务器,即使与开发服务器不同,至少也比它更新。

\n

关于忽略兼容性错误:

\n
\n

将转储文件加载到旧服务器中可能需要手动编辑转储文件以删除旧服务器无法理解的语法。在跨版本情况下,建议使用 --quote-all-identifiers 选项,因为它可以防止不同 PostgreSQL 版本中不同的保留字列表引起的问题。

\n
\n

最后的建议是,如果您计划延长软件的使用寿命,请始终考虑升级,因为旧版本有一天会被弃用。当提出这个问题时,PgSQL 8 仍然有版本。现在您只有 9.6 版本。

\n


Cra*_*ger 9

在不同的主要版本中使用 pg_dump/pg_restore 是不是一个坏主意

通常建议您pg_dump对要恢复到的版本使用。

从旧版本到新版本时,您应该使用更新的 pg_dump。

真的有点烦

还是可以像我在这里所做的那样安全地忽略兼容性错误?

这取决于它们是什么。你可以忽略那个,是的。

我将来会被这个咬吗?

这取决于你做什么。显然,您不能忽略所有错误 - 例如,如果CREATE TABLE失败,您就有麻烦了。所以这取决于使用的功能等。

我无法升级 P,为了安全起见,我应该将 D 降级到 8.4.20 吗?

是的。使用您在生产中运行的相同版本进行开发。

不过,您迟早需要升级 P。开始计划。它不受支持,不会得到进一步的错误修正,不会被打包用于新的操作系统版本,并且错误/问题报告将通过“升级到受支持的版本并查看它是否仍然发生在那里”来解决。


小智 7

对于遇到这个问题的人:最好使用相同的版本进行恢复。然而,这往往不切实际

示例:我的本地开发机器主要是 Postgres 12.1(端口 5433),用于开发下一个版本。我还安装了 Postgres 11(端口 5432),因为我们的生产和 CI 仍在 Postgres 11 上。

所以我做了以下事情:

  • 在PG 12.1中创建测试数据库

  • 手动将适当的迁移脚本应用于 CI 中使用的示例数据

  • 使用 PG 12 pg_dump 导出以制作转储文件

"c:\Program Files\PostgreSQL\12\bin\pg_dump" -U postgres -p 5433 -d ut_20200621 --no-owner --no-acl "f:\dumps\ut_20200621_pg12.backup"

  • 使用 PG 12 pg_restore 将其加载到 Postgres 11(与服务器的端口不同,但 PG 版本相同)

"c:\Program Files\PostgreSQL\12\bin\pg_restore" -U postgres -p 5432 -d ut_20200621 --no-owner --no-acl "f:\dumps\ut_20200621_pg12.backup"

  • 然后在 pg11 上创建转储:注意不同版本的使用

"c:\Program Files\PostgreSQL\11\bin\pg_restore" -U postgres -p 5432 -d ut_20200621 --no-owner --no-acl "f:\dumps\ut_20200621_pg12.backup"

然后我的 CI 服务器就可以使用我手动创建的升级后的数据库。

对于发布,数据迁移是手动运行的:首先在暂存中,然后在生产中。