升级期间,我遇到了
正在停止 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
我陷入了无限循环,数据库更新正常,但当我运行 ./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)...
似乎没有一个解决方案有效。这太令人沮丧了。
有人主动提出这样的服务,而你并没有先向他寻求帮助,这很不寻常。
如果你想雇佣某人,这里是你可以去的地方:Marketplace - Discourse Meta
升级后,我们的多站点实例已关闭。它显示:
您的安装包含应使用 ALTER EXTENSION 命令更新的扩展。文件
update_extensions.sql
由数据库超级用户通过 psql 执行后将更新这些扩展。
我在任何地方都找不到 update_extensions.sql 文件。它会位于何处?
检查此项
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 -- : 正在生成区域设置(这可能需要一段时间)...
是我。当有人似乎处于一种难以在此处获得帮助就能解决的境地时,我就会主动提供帮助。
好奇心提问。
关于像 Postgres 这样的关键组件升级,是否有标准或策略?
我看到 Postgres 13 的支持持续到 11 月 25 日,15 的支持持续到 2027 年,而当前版本是 17。
我只是想学习和理解。更改数据库版本通常是一件大事,而且工作量很大。
谢谢!
我自PostgreSQL 10版本起就一直使用。他们通常每两个版本升级一次,虽然他们从12升到13,是因为有一些改进让提前切换变得值得。我有点惊讶他们没有直接升到16。
如果你有足够的磁盘空间和最新的Docker,升级通常会非常顺利。
我已恢复到 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。
这次需要git pull吗?通常不需要。
如今再也不需要了,因为重建会完成这些。
第一个错误中最后的 Device or resource busy 消息暗示有其他东西锁定了 postgres_data 目录,因此无法移动它。
由于这是数据库目录,一个可能的解释是 postgres_data 是一个挂载点。这甚至更可能,因为我们在第二个 mv 命令中看到了 inter-device move failed,这意味着 shared/postgres_data_new 和 shared/postgres_data 在不同的磁盘/分区上。
如果确认 postgres_data 是一个挂载点,您将不得不手动将 postgres_data 中的所有文件移出到某个其他备份目录,然后在第一个重建完成并显示 UPGRADE OF POSTGRES COMPLETE 之后,但在发出第二个重建之前,将 postgres_data_new 中的所有文件移入(现在空的)postgres_data 目录。
如果 postgres_data 不是挂载点,那么 lsof 是您的好帮手。您可以使用它来尝试识别是什么导致了锁定。
当然,请先做好必要的备份。
太好了,谢谢你。
这些文件位于以下文件夹:
/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
再次感谢 ![]()
我有一个 62g 的数据库,您建议进行什么最佳升级?
62G /var/discourse/shared/standalone/postgres_data
我建议您迁移到一个新的虚拟机,启动一个新的 Discourse 实例,并使用一个空的数据库(如果您希望实现零停机切换,可以复制 ssl 和 letsencrypt 目录),然后将当前数据库恢复到新服务器。这样您就可以在零停机时间和零风险的情况下进行升级。
也许现在是时候升级您的操作系统了。
这是个好主意。
我能否将 ### 3.4.0.beta4-dev 备份 ### 恢复到最新版本的全新安装中?
如果你在问是否可以将旧版本的Discourse还原到可能获得的新版Discourse,答案是可以的。