PostgreSQL 18 备份失败

我们 Discourse 实例的数据库并非本地容器,而是使用了一个集中式数据库集群。最近,中央 PostgreSQL 已更新至 18.3 版本。我注意到现在的 Discourse 备份失败了:

[2026-05-19 03:37:37] [STARTED]
[2026-05-19 03:37:37] 'system' 已启动备份!
[2026-05-19 03:37:37] 将备份标记为运行中...
[2026-05-19 03:37:37] 确保 '/var/www/discourse/tmp/backups/default/2026-05-19-033737' 存在...
[2026-05-19 03:37:37] 确保 '/var/www/discourse/public/backups/default' 存在...
[2026-05-19 03:37:37] 更新元数据...
[2026-05-19 03:37:37] 转储数据库的公共架构...
[2026-05-19 03:37:37] pg_dump: 错误:因服务器版本不匹配而中止
[2026-05-19 03:37:37] pg_dump: 详情:服务器版本:18.3 (Ubuntu 18.3-1.pgdg24.04+1);pg_dump 版本:15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] 异常:pg_dump 失败
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'

有什么修复建议吗?

这看起来像是 PostgreSQL 客户端与服务器的版本不匹配。

备份操作是在 Discourse 容器中执行的,其中 pg_dump 的版本为 15.15,而外部 PostgreSQL 服务器的版本为 18.3

server version: 18.3; pg_dump version: 15.15

除非 Discourse 团队明确建议,否则我对修改 Discourse 容器会持谨慎态度。我的第一反应是保持外部数据库集群与 Discourse 当前预期或支持的 PostgreSQL 版本保持一致。

好的,明白了。在这种情况下,我们别无选择,因为另一个使用相同数据库集群的项目需要 18 个资源。嗯,听起来我们需要一台独立的数据库服务器,专门分配 15 个资源给 Discourse。

CDCK 方面有什么意见吗?

或许可以原地升级客户端?

鉴于您似乎已经证明了与 PG 18 的兼容性,因为您正在将其用作生产数据库,这看起来风险较低。

我之前用外部 PostgreSQL 18 和一个临时的 Discourse 安装做过一次快速测试,没有发现问题。但说实话,那只是“快速粗糙”的测试,并非“深入”测试。不过,系统已经稳定运行两周了,所以我估计应该没问题。目前唯一的问题是 Discourse 内部的备份功能。另一方面,数据库服务器本身(运行在 LXC 容器中)也已单独进行了备份。

您可能遇到的唯一挑战是,客户端的升级可能需要 Ubuntu 的版本升级,除非您准备好自行构建(相当麻烦)……

更新:是的,Ubuntu 26.04 已在默认软件源中预装 PostgreSQL 18,因此请升级到该版本,并在必要时安装客户端。之后您即可顺利使用……

过去的政策是每隔一个版本进行升级。然而,PostgreSQL 17 发布已过去 1.5 年,而官方 Docker 镜像仍在使用 15 版本,因此我不确定这一政策是否仍然适用。

过去有一些几乎相同的话题可供参考,例如:Any chance to upgrade the postgres-client version?

只是想到一个问题——你能直接从命令行在 pg 服务器上转储数据吗?