PostgreSQL 15 更新

升级期间,我遇到了

正在停止 PostgreSQL 15 数据库服务器:main错误:配置所有者 (postgres:101) 和数据所有者 (runit-log:999) 不匹配,并且配置所有者不是 root … 失败!
失败!
无法打开版本文件“/shared/postgres_data/PG_VERSION”:权限被拒绝
失败,正在退出

通过以下方式解决了

sudo ./launcher enter app

然后

chown -R postgres:postgres /shared/postgres_data
chown -R postgres:postgres /shared/postgres_run
chmod -R 700 /shared/postgres_data

3 个赞

我陷入了无限循环,数据库更新正常,但当我运行 ./launcher rebuild app 时,它只是在循环,我唯一能看到的是以下内容:

编辑:发现了这条消息……

mv: 跨设备移动失败:“/shared/postgres_data_new”到“/shared/postgres_data/postgres_data_new”;无法删除目标:目录非空

您的安装包含应使用 ALTER EXTENSION 命令更新的扩展。
    update_extensions.sql
文件由数据库超级用户通过 psql 执行时将更新这些扩展。

请提供建议

升级完成
----------------
pg_upgrade 不会传输优化器统计信息。
一旦您启动新服务器,请考虑运行:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

运行此脚本将删除旧集群的数据文件:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
POSTGRES 升级完成

旧的 13 数据库存储在 /shared/postgres_data_old

要完成升级,请再次使用以下命令重建:

./launcher rebuild app
-------------------------------------------------------------------------------------

好的,看来问题出在这里:

这些位于 shared/standalone/ 并已手动移动……

mv: 无法将 '/shared/postgres_data' 移动到 '/shared/postgres_data_old':设备或资源繁忙
mv: 跨设备移动失败:“/shared/postgres_data_new”到“/shared/postgres_data/postgres_data_new”;无法删除目标:目录非空
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : Generating locales (this might take a while)...
1 个赞

似乎没有一个解决方案有效。这太令人沮丧了。

1 个赞

有人主动提出这样的服务,而你并没有先向他寻求帮助,这很不寻常。
如果你想雇佣某人,这里是你可以去的地方:Marketplace - Discourse Meta

4 个赞

升级后,我们的多站点实例已关闭。它显示:

您的安装包含应使用 ALTER EXTENSION 命令更新的扩展。文件
update_extensions.sql
由数据库超级用户通过 psql 执行后将更新这些扩展。

我在任何地方都找不到 update_extensions.sql 文件。它会位于何处?

2 个赞

检查此项

mv: 无法将 '/shared/postgres_data' 移动到 '/shared/postgres_data_old':设备或资源繁忙
mv: 跨设备移动失败:'/shared/postgres_data_new' 到 '/shared/postgres_data/postgres_data_new';无法删除目标:目录非空
I, [2025-02-08T15:22:42.078189 #1]  INFO -- : 正在生成区域设置(这可能需要一段时间)...

是我。当有人似乎处于一种难以在此处获得帮助就能解决的境地时,我就会主动提供帮助。

4 个赞

好奇心提问。

关于像 Postgres 这样的关键组件升级,是否有标准或策略?

我看到 Postgres 13 的支持持续到 11 月 25 日,15 的支持持续到 2027 年,而当前版本是 17。

我只是想学习和理解。更改数据库版本通常是一件大事,而且工作量很大。

谢谢!

1 个赞

我自PostgreSQL 10版本起就一直使用。他们通常每两个版本升级一次,虽然他们从12升到13,是因为有一些改进让提前切换变得值得。我有点惊讶他们没有直接升到16。

如果你有足够的磁盘空间和最新的Docker,升级通常会非常顺利。

3 个赞

我已恢复到 13 模板,直到有修复程序,谢谢

我已成功解决了PostgreSQL 13 到 15 升级问题,在从备份恢复了升级失败的服务器后,以下步骤在 PostgreSQL en_GB.UTF-8 区域设置下对我有效:

sudo -i
su - discourse
cd /var/discourse
git stash
git stash drop
git pull
./launcher stop app
docker run --rm \
    --entrypoint=/bin/bash \
    -e LANG='en_GB.UTF-8' \
    -v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
    -v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
    tianon/postgres-upgrade:13-to-15 \
    -c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
    apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
    docker-upgrade'
exit
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
chown -R 101:104 /var/discourse/shared/standalone/postgres_data
su - discourse
cd /var/discourse
docker run --rm -v /var/discourse/shared/standalone:/shared \
local_discourse/app chown -R postgres:postgres /shared/postgres_data 
./launcher rebuild app

我需要删除过去为 PostgreSQL LANG 所做的本地更改,使用 git stash; git stash drop,并且 PostgreSQL 数据目录的移动需要以 root 身份进行,还需要进行 chown

5 个赞

这次需要git pull吗?通常不需要。

1 个赞

如今再也不需要了,因为重建会完成这些。

3 个赞

第一个错误中最后的 Device or resource busy 消息暗示有其他东西锁定了 postgres_data 目录,因此无法移动它。

由于这是数据库目录,一个可能的解释是 postgres_data 是一个挂载点。这甚至更可能,因为我们在第二个 mv 命令中看到了 inter-device move failed,这意味着 shared/postgres_data_newshared/postgres_data 在不同的磁盘/分区上。

如果确认 postgres_data 是一个挂载点,您将不得不手动将 postgres_data 中的所有文件移出到某个其他备份目录,然后在第一个重建完成并显示 UPGRADE OF POSTGRES COMPLETE 之后,但在发出第二个重建之前,将 postgres_data_new 中的所有文件移入(现在空的)postgres_data 目录。

如果 postgres_data 不是挂载点,那么 lsof 是您的好帮手。您可以使用它来尝试识别是什么导致了锁定。

当然,请先做好必要的备份。

3 个赞

太好了,谢谢你。

这些文件位于以下文件夹:

/var/postgres_data_discourse 目录下,名为 postgres_data_new

以下操作解决了问题:
我将 postgres_data_new 移动到 /var
postgres_data_discourse 重命名为 postgres_data_discourse_old
postgres_data_new 重命名为 postgres_data_discourse
执行 ./launcher rebuild app

再次感谢 :+1:

5 个赞

我有一个 62g 的数据库,您建议进行什么最佳升级?

62G /var/discourse/shared/standalone/postgres_data

1 个赞

我建议您迁移到一个新的虚拟机,启动一个新的 Discourse 实例,并使用一个空的数据库(如果您希望实现零停机切换,可以复制 ssl 和 letsencrypt 目录),然后将当前数据库恢复到新服务器。这样您就可以在零停机时间和零风险的情况下进行升级。

也许现在是时候升级您的操作系统了。

2 个赞

这是个好主意。
我能否将 ### 3.4.0.beta4-dev 备份 ### 恢复到最新版本的全新安装中?

1 个赞

如果你在问是否可以将旧版本的Discourse还原到可能获得的新版Discourse,答案是可以的。

4 个赞