PostgreSQL 15 更新

我在进行此升级时也遇到了严重问题。与 @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_datapostgres_data_old
postgres_newpostgres_data

然后运行 ./launcher rebuild app。这看起来很简单,但当我重建时,我仍然陷入循环,并最终得到以下目录:

  • postgres_data_older
  • postgres_data_old(我认为它变成了 postgres_data_older
  • postgres_data
  • postgres_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
-------------------------------------------------------------------------------------
1 个赞