我在进行此升级时也遇到了严重问题。与 @Vaping_Community 类似,我的 PostgreSQL 位于不同的挂载卷上(/mnt/volume_tor1_01/shared/standalone)。
我收到了以下错误:
mv: 无法将 '/shared/postgres_data' 移动到 '/shared/postgres_data_old':设备或资源忙
mv: 跨设备移动失败:'/shared/postgres_data_new' 到 '/shared/postgres_data/postgres_data_new';无法删除目标:目录非空
[...]
升级完成
----------------
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
-------------------------------------------------------------------------------------
我的理解是,解决方案基本上是手动重命名:
postgres_data → postgres_data_old
postgres_new → postgres_data
然后运行 ./launcher rebuild app。这看起来很简单,但当我重建时,我仍然陷入循环,并最终得到以下目录:
postgres_data_older(我认为它变成了postgres_data_oldpostgres_data_older)postgres_datapostgres_data_new
似乎由于某种原因,它没有识别到 postgres_data 已更新,尝试再次执行操作,但在尝试移动目录时失败。
$ cat postgres_data/PG_VERSION
15
我也尝试了 OP 中列出的手动方法,但同样没有成功。请帮忙!
完整日志
x86_64 架构已检测到。
确保启动器是最新的
获取 origin
启动器已是最新版本
停止旧容器
+ /usr/bin/docker stop -t 600 app
app
2.0.20250129-0720: 从 discourse/base 拉取
摘要:sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
状态:discourse/base:2.0.20250129-0720 镜像已是最新
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-02-23T11:41:32.477354 #1] INFO -- : 从标准输入读取
I, [2025-02-23T11:41:32.504068 #1] INFO -- : 文件 > /etc/service/postgres/run chmod: +x chown:
I, [2025-02-23T11:41:32.508552 #1] INFO -- : 文件 > /etc/service/postgres/log/run chmod: +x chown:
I, [2025-02-23T11:41:32.513290 #1] INFO -- : 文件 > /etc/runit/3.d/99-postgres chmod: +x chown:
I, [2025-02-23T11:41:32.517671 #1] INFO -- : 文件 > /root/install_postgres chmod: +x chown:
I, [2025-02-23T11:41:32.522244 #1] INFO -- : 文件 > /root/upgrade_postgres chmod: +x chown:
I, [2025-02-23T11:41:32.523354 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 data_directory = '/var/lib/postgresql/15/main' 替换为 data_directory = '/shared/postgres_data'
I, [2025-02-23T11:41:32.523912 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?listen_addresses *=.*) 替换为 listen_addresses = '*'
I, [2025-02-23T11:41:32.524756 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?synchronous_commit *=.*) 替换为 synchronous_commit = $db_synchronous_commit
I, [2025-02-23T11:41:32.525365 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?shared_buffers *=.*) 替换为 shared_buffers = $db_shared_buffers
I, [2025-02-23T11:41:32.526239 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?work_mem *=.*) 替换为 work_mem = $db_work_mem
I, [2025-02-23T11:41:32.526873 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?default_text_search_config *=.*) 替换为 default_text_search_config = '$db_default_text_search_config'
I, [2025-02-23T11:41:32.527613 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?checkpoint_segments *=.*) 替换为 checkpoint_segments = $db_checkpoint_segments
I, [2025-02-23T11:41:32.531734 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?logging_collector *=.*) 替换为 logging_collector = $db_logging_collector
I, [2025-02-23T11:41:32.532882 #1] INFO -- : 在 /etc/postgresql/15/main/postgresql.conf 中将 (?-mix:#?log_min_duration_statement *=.*) 替换为 log_min_duration_statement = $db_log_min_duration_statement
I, [2025-02-23T11:41:32.534021 #1] INFO -- : 在 /etc/postgresql/15/main/pg_hba.conf 中将 (?-mix:^#local +replication +postgres +peer$) 替换为 local replication postgres peer
I, [2025-02-23T11:41:32.534342 #1] INFO -- : 在 /etc/postgresql/15/main/pg_hba.conf 中将 (?-mix:^host.*all.*all.*127.*$) 替换为 host all all 0.0.0.0/0 md5
I, [2025-02-23T11:41:32.534935 #1] INFO -- : 在 /etc/postgresql/15/main/pg_hba.conf 中将 (?-mix:^host.*all.*all.*::1\/128.*$) 替换为 host all all ::/0 md5
I, [2025-02-23T11:41:32.535476 #1] INFO -- : > if [ -f /root/install_postgres ]; then
/root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres 已在运行,请停止容器 ; exit 1
fi
initdb: 警告:对本地连接启用“信任”身份验证
initdb: 提示:您可以通过编辑 pg_hba.conf 或使用选项 -A,或 --auth-local 和 --auth-host 来更改此设置,下次运行 initdb 时。
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: 密钥存储在传统的 trusted.gpg 密钥环中 (/etc/apt/trusted.gpg),有关详细信息,请参阅 apt-key(8) 中的 DEPRECATION 部分。
debconf: 由于未安装 apt-utils,延迟软件包配置。
mv: 无法将 '/shared/postgres_data' 移动到 '/shared/postgres_data_old':设备或资源忙
mv: 跨设备移动失败:'/shared/postgres_data_new' 到 '/shared/postgres_data/postgres_data_new';无法删除目标:目录非空
I, [2025-02-23T11:42:52.303584 #1] INFO -- : 生成区域设置(这可能需要一些时间)...
en_US.UTF-8... 完成
生成完成。
将 PostgreSQL 从版本 13 升级到 15
属于此数据库系统的文件将由用户 "postgres" 拥有。
该用户还必须拥有服务器进程。
数据库集群将使用区域设置 "en_US.UTF-8" 初始化。
默认数据库编码已相应设置为 "UTF8"。
默认文本搜索配置将设置为 "english"。
数据页校验和已禁用。
修复现有目录 /shared/postgres_data_new 的权限 ... 完成
创建子目录 ... 完成
选择动态共享内存实现 ... posix
选择默认 max_connections ... 100
选择默认 shared_buffers ... 128MB
选择默认时区 ... Etc/UTC
创建配置文件 ... 完成
运行引导脚本 ... 完成
执行引导后初始化 ... 完成
将数据同步到磁盘 ... 完成
成功。您现在可以使用以下命令启动数据库服务器:
/usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start
获取:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
获取:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
获取:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
获取:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
获取:5 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
获取:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
获取:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [283 kB]
获取:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
获取:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
获取:10 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
获取:11 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
获取:12 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
获取:13 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
获取:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,636 B]
获取:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
已获取 10.2 MB,耗时 2 秒 (6,490 kB/s)
正在读取软件包列表...
正在读取软件包列表...
正在构建依赖关系树...
正在读取状态信息...
将安装以下附加软件包:
libllvm19 postgresql-client-13
建议的软件包:
postgresql-doc-13
将安装以下新软件包:
libllvm19 postgresql-13 postgresql-13-pgvector postgresql-client-13
0 个已升级,4 个新安装,0 个待删除,12 个未升级。
需要获取 41.6 MB 的归档文件。
此操作后,将额外使用 184 MB 的磁盘空间。
获取:1 http://deb.debian.org/debian bookworm/main amd64 libllvm19 amd64 1:19.1.4-1~deb12u1 [25.9 MB]
获取:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.20-1.pgdg120+1 [1,538 kB]
获取:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.20-1.pgdg120+1 [13.9 MB]
获取:4 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
已获取 41.6 MB,耗时 2 秒 (18.8 MB/s)
选择以前未选中的软件包 libllvm19:amd64。
(正在读取数据库 ... 当前已安装 33363 个文件和目录。)
正在准备解包 .../libllvm19_1%3a19.1.4-1~deb12u1_amd64.deb ...
正在解包 libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
选择以前未选中的软件包 postgresql-client-13。
正在准备解包 .../postgresql-client-13_13.20-1.pgdg120+1_amd64.deb ...
正在解包 postgresql-client-13 (13.20-1.pgdg120+1) ...
选择以前未选中的软件包 postgresql-13。
正在准备解包 .../postgresql-13_13.20-1.pgdg120+1_amd64.deb ...
正在解包 postgresql-13 (13.20-1.pgdg120+1) ...
选择以前未选中的软件包 postgresql-13-pgvector。
正在准备解包 .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
正在解包 postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
正在设置 libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
正在设置 postgresql-client-13 (13.20-1.pgdg120+1) ...
正在设置 postgresql-13 (13.20-1.pgdg120+1) ...
正在创建新的 PostgreSQL 集群 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
属于此数据库系统的文件将由用户 "postgres" 拥有。
该用户还必须拥有服务器进程。
数据库集群将使用区域设置 "C.UTF-8" 初始化。
默认数据库编码已相应设置为 "UTF8"。
默认文本搜索配置将设置为 "english"。
数据页校验和已禁用。
修复现有目录 /var/lib/postgresql/13/main 的权限 ... 完成
创建子目录 ... 完成
选择动态共享内存实现 ... posix
选择默认 max_connections ... 100
选择默认 shared_buffers ... 128MB
选择默认时区 ... Etc/UTC
创建配置文件 ... 完成
运行引导脚本 ... 完成
执行引导后初始化 ... 完成
将数据同步到磁盘 ... 完成
成功。您现在可以使用以下命令启动数据库服务器:
pg_ctlcluster 13 main start
invoke-rc.d: 无法确定当前运行级别
invoke-rc.d: policy-rc.d 拒绝了启动执行。
正在设置 postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
正在处理 libc-bin (2.36-9+deb12u9) 的触发器 ...
正在处理 postgresql-common (267.pgdg120+1) 的触发器 ...
从已安装的 myspell/hunspell 软件包构建 PostgreSQL 字典...
删除过时的字典文件:
正在停止 PostgreSQL 13 数据库服务器:main。
正在停止 PostgreSQL 15 数据库服务器:main。
执行一致性检查
-----------------------------
检查集群版本 完成
检查数据库用户是否为安装用户 完成
检查数据库连接设置 完成
检查是否存在预准备事务 完成
检查用户表中是否存在系统定义的复合类型 完成
检查用户表中是否存在 reg* 数据类型 完成
检查 contrib/isn 是否存在 bigint 传递不匹配 完成
检查是否存在用户定义的编码转换 完成
检查是否存在用户定义的后缀运算符 完成
检查是否存在不兼容的多态函数 完成
创建全局对象转储 完成
创建数据库架构转储 完成
检查是否存在所需的库 完成
检查数据库用户是否为安装用户 完成
检查是否存在预准备事务 完成
检查新集群表空间目录 完成
如果 pg_upgrade 在此点之后失败,您必须重新初始化
新集群才能继续。
执行升级
------------------
分析新集群中的所有行 完成
冻结新集群中的所有行 完成
从新 pg_xact 删除文件 完成
将旧 pg_xact 复制到新服务器 完成
为新集群设置最旧的 XID 完成
为新集群设置下一个事务 ID 和纪元 完成
从新 pg_multixact/offsets 删除文件 完成
将旧 pg_multixact/offsets 复制到新服务器 完成
从新 pg_multixact/members 删除文件 完成
将旧 pg_multixact/members 复制到新服务器 完成
为新集群设置下一个 multixact ID 和偏移量 完成
重置 WAL 归档 完成
在新集群中设置 frozenxid 和 minmxid 计数器 完成
在新集群中恢复全局对象 完成
在新集群中恢复数据库架构 完成
复制用户关系文件 完成
为新集群设置下一个 OID 完成
将数据目录同步到磁盘 完成
创建删除旧集群的脚本 完成
检查扩展更新 notice
您的安装包含应使用 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
-------------------------------------------------------------------------------------