PostgreSQL 15 更新

成功。您现在可以使用以下命令启动数据库服务器:

    pg_ctlcluster 13 main start

invoke-rc.d:无法确定当前运行级别
invoke-rc.d:policy-rc.d 拒绝执行 start。
正在设置 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。
正在执行一致性检查
-----------------------------
正在检查集群版本                                   ok
源集群未干净关闭。
失败,正在退出
-------------------------------------------------------------------------------------
POSTGRES 升级失败
请访问 https://meta.discourse.org/t/postgresql-15-update/349515 获取支持。
在此期间,您可以运行 ./launcher start app 来重启您的应用程序
-------------------------------------------------------------------------------------


失败
--------------------
Pups::ExecError: 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 already running stop container ; exit 1
fi
 使用返回 #<Process::Status: pid 17 exit 1> 失败
失败位置:/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
使用参数 {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"} 执行失败
引导失败,退出代码为 1
** 引导失败 ** 请向上滚动并查找更早的错误消息,可能不止一个。
./discourse-doctor 可能有助于诊断问题。
cbebd339ee3bd1e246300784f7825042702c1b5032877bfe580cb7f635fb852b

磁盘信息:

========================================
Discourse 3.4.0.beta3
mydomian 上的 Discourse 版本:Discourse 3.4.0.beta3
localhost 上的 Discourse 版本:Discourse 3.4.0.beta3


==================== 内存信息 ====================
RAM (MB):2055

              总计        已用        可用        共享    缓冲区/缓存    可用
内存:           1960        1463         100          43         396         255
交换:           2047          66        1981

==================== 磁盘空间检查 ====================
---------- 操作系统磁盘空间 ----------
文件系统      大小  已用 可用 使用% 挂载点
/dev/root        59G   45G   14G  77% /

---------- 容器磁盘空间 ----------
文件系统      大小  已用 可用 使用% 挂载点
overlay          59G   45G   14G  77% /
/dev/root        59G   45G   14G  77% /shared
/dev/root        59G   45G   14G  77% /var/log

==================== 磁盘信息 ====================
磁盘 /dev/loop0: 110.24 MiB, 115593216 字节, 225768 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop2: 73.91 MiB, 77479936 字节, 151328 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop3: 103.102 MiB, 109043712 字节, 212976 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop4: 73.89 MiB, 77459456 字节, 151288 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop5: 55.68 MiB, 58363904 字节, 113992 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop6: 63.71 MiB, 66789376 字节, 130448 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop7: 63.10 MiB, 67080192 字节, 131016 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/xvda: 60 GiB, 64424509440 字节, 125829120 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x15e6b846

设备     启动 起始       结束    扇区  大小 类型
/dev/xvda1 *     2048 125829086 125827039  60G 83 Linux


磁盘 /dev/loop8: 26.33 MiB, 27602944 字节, 53912 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop9: 110.4 MiB, 115384320 字节, 225360 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop10: 55.37 MiB, 58052608 字节, 113384 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop11: 104.2 MiB, 109252608 字节, 213384 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节


磁盘 /dev/loop13: 25.76 MiB, 26992640 字节, 52720 扇区
单位:扇区 * 1 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

==================== 磁盘信息结束 ====================

如果我在尝试重建时遇到此问题,是否应该先升级 Docker?

我现在使用的是 3.4.0.beta3-dev(93983286b5)

更新:我再次重建,这次成功了。

2 个赞

OP 中有关于此的特定说明。

无论您是否有任何问题,都应该升级 Docker。

2 个赞

对我来说,最终有帮助的是更新了docker。
我遵循了 https://stackoverflow.com/a/30794189,然后运行了:
sudo service docker start

之后才运行:

./launcher start app
./launcher stop app
./launcher rebuild app
3 个赞

I’m having significant problems doing this upgrade too. Similar @Vaping_Community, I have postgres on a different mounted volume (/mnt/volume_tor1_01/shared/standalone).

I am getting this error

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty

 [...]

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

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

My understanding is that the solution is to basically manually rename
postgres_datapostgres_data_old
postgres_newpostgres_data

then run ./launcher rebuild app. Seems simple enough, but when I rebuild, I still am stuck in the loop and end up with the following directories:

  • postgres_data_older
  • postgres_data_old (I think it becomes postgres_data_older)
  • postgres_data
  • postgres_data_new

It seems like for some reason it’s not recognizing that postgres_data has updated, tries to do it again, fails when trying to move the directory.

$ cat postgres_data/PG_VERSION 
15

I tried the manual approach laid out in the OP but no luck either. Please help!

full log
x86_64 arch detected.
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for 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 -- : Reading from stdin
I, [2025-02-23T11:41:32.504068 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.508552 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.513290 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.517671 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.522244 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.523354 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.523912 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.524756 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.525365 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526239 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526873 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.527613 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.531734 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.532882 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.534021 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-23T11:41:32.534342 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-23T11:41:32.534935 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
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 already running stop container ; exit 1
fi

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old': Device or resource busy
mv: inter-device move failed: '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new'; unable to remove target: Directory not empty
I, [2025-02-23T11:42:52.303584 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [283 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
Get:12 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
Get:13 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,636 B]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10.2 MB in 2s (6,490 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libllvm19 postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  libllvm19 postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 4 newly installed, 0 to remove and 12 not upgraded.
Need to get 41.6 MB of archives.
After this operation, 184 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main amd64 libllvm19 amd64 1:19.1.4-1~deb12u1 [25.9 MB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.20-1.pgdg120+1 [1,538 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.20-1.pgdg120+1 [13.9 MB]
Get:4 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 41.6 MB in 2s (18.8 MB/s)
Selecting previously unselected package libllvm19:amd64.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../libllvm19_1%3a19.1.4-1~deb12u1_amd64.deb ...
Unpacking libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Selecting previously unselected package postgresql-client-13.
Preparing to unpack .../postgresql-client-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.20-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.20-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Setting up postgresql-client-13 (13.20-1.pgdg120+1) ...
Setting up postgresql-13 (13.20-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluster               ok
Copying user relation files                                 ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to delete old cluster                       ok
Checking for extension updates                              notice

Your installation contains extensions that should be updated
with the ALTER EXTENSION command.  The file
    update_extensions.sql
when executed by psql by the database superuser will update
these extensions.


Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------
1 个赞

ARM (aarch64) 上的升级(非默认区域设置)

我花了一些时间修复了一个单服务器双容器设置中的错误升级。

  1. 它的 CPU 是 ARM
  2. Discourse 配置为 en_UK.UTF-8 区域设置

逐步排查后,我发现:

  1. tianon/postgres-upgrade:13-to-15 在 ARM 上无法工作
  2. 区域设置配置存储在 share/${CONTAINER}/postgres_data/postgresql.conf

我首先注释掉了数据容器的 env: 部分,以确保它使用默认区域设置。

因此,为了摆脱升级的混乱,我采取了一个_危险_的步骤,假设 en_GBen_US 之间的排序规则差异可以忽略不计,并无情地将整个集群更新为 en_US

UPDATE pg_database SET datctype='en_US.UTF-8', datcollate='en_US.UTF-8';

我_不确定_这一步是否必需,YMMV(你的里程可能会有所不同)。我将其留在这里供更有知识的人评论,并且我绝对不推荐对不同语言使用此方法!

然后我替换了 postgresql.conf 中的区域设置:

sed -i -e 's/en_GB/en_US/g' shared/data/postgres_data/postgresql.conf
sudo -H -u discourse ./launcher rebuild data
...
UPGRADE OF POSTGRES COMPLETE

:tada:

别以为这很容易:我没有提到探索选项的长路,尤其是在我介入时,管理员界面不可用,而最后一次备份是在 6 天前。我_不得不_摸索一番,才能找到一个合适的——或者至少是可行的——解决方案。

希望这能为一些人节省时间。

5 个赞

您是否仍然在每次重建的日志中看到此内容?如果是这样,我怀疑您在此处以某种方式查看了(因此手动重命名了)错误的目录:

如果容器的 /shared 卷映射到主机上的 /mnt/volume_tor1_01/shared/standalone,那么 cat /mnt/volume_tor1_01/shared/standalone/postgres_data/PG_VERSION 应该返回 13 而不是 15

您能否分享您已清理的 app.yml 文件?

4 个赞

我认为您正确地指出了问题所在。这是我在 app.yml 中看到的内容:

## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone
      guest: /shared
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone/log/var-log
      guest: /var/log
  - volume:
      host: /var/postgres_data_discourse
      guest: /shared/postgres_data

(基于此指南 https://meta.discourse.org/t/move-uploads-and-backups-to-digitalocean-block-storage/89274)

$ cat postgres_data/PG_VERSION
15
$ cat /var/postgres_data_discourse/PG_VERSION
13

所以我认为这个问题确实可以通过这个方法解决 PostgreSQL 15 update - #125 by Vaping_Community

我想让我感到困惑的是,我在 mnt 卷上有多个 postgres_data 文件夹(因为我重新运行了重建),并且没有意识到源文件夹实际上在 /var/ 中。

我今晚晚些时候会尝试一下。

2 个赞

启动一个新的虚拟机并在那里还原备份会容易得多。这样你就完全跳过了PG升级步骤,也不会在新网站正常工作之前破坏旧站点。

8 个赞

它奏效了 :slight_smile:

2 个赞

请注意,UID 会更改!

/launcher enter app
检测到 x86_64 架构。
grep postgres /etc/passwd
postgres:x:101:104:PostgreSQL 管理员,,,:/var/lib/postgresql:/bin/bash

这刚刚让我栽了跟头……

是的,对我来说是有效的,但最好使用 OP-post 中的更新说明。

我无法编辑我的帖子来添加注释。

2 个赞

我也遇到了同样的问题。

more /var/discourse/shared/standalone/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log

-----------------------------------------------------------------
  pg_upgrade run on Wed Apr 16 10:33:11 2025
-----------------------------------------------------------------

command: "/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o
"-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start >> "/shared/postgres_data_new/pg_upgrade_output.d/
20250416T103311.340/log/pg_upgrade_server.log" 2>&1
waiting for server to start....2025-04-16 10:33:11.515 UTC [1887] LOG:  starting PostgreSQL 13.20 (Debian 13.20-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12
.2.0-14) 12.2.0, 64-bit
2025-04-16 10:33:11.517 UTC [1887] LOG:  listening on Unix socket "/var/lib/postgresql/.s.PGSQL.50432"
2025-04-16 10:33:11.525 UTC [1887] LOG:  could not open configuration file "/etc/postgresql/13/main/pg_hba.conf": No such file or directory
2025-04-16 10:33:11.525 UTC [1887] FATAL:  could not load pg_hba.conf
2025-04-16 10:33:11.526 UTC [1887] LOG:  database system is shut down

看起来它找不到 /etc/postgresql/13/main/pg_hba.conf,而且确实没有在那里。但它在多个位置:

/var/discourse/shared/standalone/postgres_data_older/pg_hba.conf
/var/discourse/shared/standalone/postgres_data_new/pg_hba.conf
/var/discourse/shared/standalone/postgres_data/pg_hba.conf
/var/lib/docker/overlay2/6514156241efd883dd59b27a0275ba1cc73a7365fb78c5782536a39ee2d6d641/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/8afed861b039e5a366dc9a5513cd7df5a958d86a41f05063ce5256fb9f8fdfec/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/fa8893e9f714439469d391635d8882b345e90705a886d74cf6fea8d5460df3f0/diff/etc/postgresql/15/main/pg_hba.conf
/var/lib/docker/overlay2/e4eec92eb7b181648ca2bc6744ac3af0935745b75b1abe89170fc4b82a8eca42/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/4cd3189b9d554b1c60891dc5d48cc670e5d7d847ec5a0f2dfa91ad7f66b3a211/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/0db2210fc76fce6f41912183f744517154f46af15a0b1a1e976999eabbd801d9/diff/etc/postgresql/15/main/pg_hba.conf
/var/postgres_data/postgres_data_new/pg_hba.conf
/var/postgres_data/pg_hba.conf

有什么线索吗?

我尝试了你的 docker run… 命令,结果出现:

检查集群版本
旧的集群数据和二进制目录来自不同的主要版本。

你的 Docker 版本是多少?你的操作系统版本是多少?我发现迁移到新虚拟机通常更容易。

Docker 版本:28.0.4
Linux 版本:5.15.0-131-generic

您可以在您的 app.yml 中尝试更改为 postgres 13 模板。

那是在容器里面。您是在容器外面查找。

我这样做是为了升级 Discourse,并且成功了,现在我有:

templates:
  - "templates/postgres.13.template.yml"

这是否意味着我不能升级 Postgres?

我认为您现在可以将其改回常规模板并重试。我会做的是迁移到一个新的虚拟机,但如果您愿意,也可以再试一次。

我已按照第一个帖子中的说明手动升级了 Postgres,但仍然无法将模板设置回 postgres.template.yml,因为它无法因相同问题重建:

2025-04-16 13:40:07.815 UTC [1888] LOG: 无法打开配置文件 “/etc/postgresql/13/main/pg_hba.conf”:No such file or directory
2025-04-16 13:40:07.815 UTC [1888] FATAL: 无法加载 pg_hba.conf

我将继续使用 13 版本,希望它将来不会出现问题。
谢谢 @pfaffman

正在尝试运行升级,但由于找不到我已确认存在的文件而失败:

日志末尾 + 文件检查

-----------------------------
检查集群版本                                   ok
 
*失败*
请参阅“/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log”的最后几行,
查找失败的可能原因。
 
连接到套接字“/var/lib/postgresql/.s.PGSQL.50432”上的服务器失败:没有此类文件或目录
        服务器是否在本地运行并接受该套接字的连接?
 
无法连接到使用以下命令启动的源 postmaster:
“/usr/lib/postgresql/13/bin/pg_ctl” -w -l “/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log” -D “/shared/postgres_data” -o “-p 50432 -b -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'” start
失败,正在退出
-------------------------------------------------------------------------------------
POSTGRES 升级失败
 
请访问 https://meta.discourse.org/t/postgresql-15-update/349515 获取支持。
 
您可以暂时运行 ./launcher start app 来重新启动您的应用程序
-------------------------------------------------------------------------------------
 
 
 
失败
--------------------
Pups::ExecError: 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 already running stop container ; exit 1
fi
 以返回 #<Process::Status: pid 17 exit 1> 失败
失败位置:/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec 失败,参数为 {“tag”=>“db”, “cmd”=>“if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n”}
引导失败,退出代码为 1
** 引导失败 ** 请向上滚动并查找更早的错误消息,可能不止一个。
./discourse-doctor 可能有助于诊断问题。
afa058b1ff7d14d9469fe27bc39dc08562c4e249bdf7c7e153b4030a1bb0dbc2
root@amcforum:/var/discourse# ./launcher start app && ./launcher enter app
检测到 x86_64 架构。
 
正在启动现有容器
+ /usr/bin/docker start app
app
检测到 x86_64 架构。
root@amcforum-app:/var/www/discourse# cat /shared/postgres_data_new/pg_upgrade_output.d/0250605T024052.178/log/pg_upgrade_server.log 
-----------------------------------------------------------------
  pg_upgrade 运行于 Thu Jun  5 02:40:52 2025
-----------------------------------------------------------------
 
命令:“/usr/lib/postgresql/13/bin/pg_ctl” -w -l “/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log” -D “/shared/postgres_data” -o “-p 50432 -b -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'” start >> “/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log” 2>&1
等待服务器启动....2025-06-05 02:40:52.313 UTC [1886] LOG:  正在启动 PostgreSQL 13.21 (Debian 13.21-1.pgdg120+1) 在 x86_64-pc-linux-gnu 上,由 gcc (Debian 12.2.0-14) 12.2.0 编译,64 位
2025-06-05 02:40:52.316 UTC [1886] LOG:  正在监听 Unix 套接字“/var/lib/postgresql/.s.PGSQL.50432”
2025-06-05 02:40:52.324 UTC [1886] LOG:  无法打开配置文件“/etc/postgresql/13/main/pg_hba.conf”:没有此类文件或目录
2025-06-05 02:40:52.324 UTC [1886] FATAL:  无法加载 pg_hba.conf
2025-06-05 02:40:52.327 UTC [1886] LOG:  数据库系统已关闭
 停止等待
pg_ctl: 无法启动服务器
检查日志输出。
 
 
root@amcforum-app:/var/www/discourse# ls -lah “/etc/postgresql/13/main/pg_hba.conf”
-rw-r----- 1 postgres postgres 4.8K Jan  3 13:02 /etc/postgresql/13/main/pg_hba.conf
root@amcforum-app:/var/www/discourse#
1 个赞