升级失败。数据库停止。(多站点安装)

我已登录。已有 11 个月未更新。开始尝试升级 Docker Manager。它似乎从未完成。第二天,管理页面几乎损坏了。我尝试运行 ./launcher rebuild app。我收到了

2025-10-30 20:04:52.144 UTC [1892] discourse@c_discourse ERROR:  must be owner of extension vector
2025-10-30 20:04:52.144 UTC [1892] discourse@c_discourse STATEMENT:  ALTER EXTENSION vector UPDATE TO ‘0.7.0’;

但数据库已停止,所以我看到的修复方法不起作用。

2025-10-31 00:27:40.021 UTC [662] FATAL:  database files are incompatible with server
2025-10-31 00:27:40.021 UTC [662] DETAIL:  The data directory was initialized by PostgreSQL version 15, which is not compatible with this version 13.16 (Debian 13.16-1.pgdg120+1).

但是

root@main-app:/var/lib/postgresql# pg_config --version
PostgreSQL 16.4 (Debian 16.4-1.pgdg120+1)

编辑:看起来数据库仍然是 13 格式?

root@main-app:/var/lib/postgresql# ls
13  take-database-backup

如果您还没有看过PostgreSQL 15 更新 - 公告主题,您可以从那里开始。它讨论了许多问题和建议。

2 个赞

谢谢。信息量太大,无法完全理解,但似乎没有一个是我的问题。:frowning: 数据库在重建过程中似乎在运行,这很奇怪。至少从我能看到的滚动信息来看是这样。

11个月后,这基本不可能成功。

你肯定需要升级 postgres 15,这也是出问题的原因之一。在升级之前,有可能可以切换到 postgres 13 并让一切恢复正常。

1 个赞

这是一个标准安装吗?

如果多站点仍被视为不受支持,则不是。

问题似乎出在我安装时,没有用户/密码连接到各个数据库。这似乎发生了变化。问题就在这里。我尝试通过添加一个用户然后添加一个密码为空的用户来对其进行一些调整,但这没有帮助。

我的配置与新的示例配置对比:


secondsite:
adapter: postgresql
database: b_discourse

pool: 25
timeout: 5000
db_id: 2
host_names:

mlp:
adapter: postgresql
database: discourse_mlp
username: discourse_mlp
password: applejack
host: dbhost
pool: 5
timeout: 5000

host_names:

这是否意味着数据库实际上是在安装过程中启动的?

2025-10-31 15:14:30.984 UTC [45] LOG:  starting PostgreSQL 15.14 (Debian 15.14-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0
-14+deb12u1) 12.2.0, 64-bit
2025-10-31 15:14:30.984 UTC [45] LOG:  listening on IPv4 address “0.0.0.0”, port 5432
2025-10-31 15:14:30.984 UTC [45] LOG:  listening on IPv6 address “::”, port 5432
2025-10-31 15:14:31.055 UTC [45] LOG:  listening on Unix socket “/var/run/postgresql/.s.PGSQL.5432”
2025-10-31 15:14:31.135 UTC [56] LOG:  database system was shut down at 2025-10-31 02:08:49 UTC
2025-10-31 15:14:31.199 UTC [45] LOG:  database system is ready to accept connections
I, [2025-10-31T15:14:35.760150 #1]  INFO – :
I, [2025-10-31T15:14:35.760557 #1]  INFO – : > /usr/local/bin/create_db
2025-10-31 15:14:35.912 UTC [63] postgres@postgres ERROR:  database “discourse” already exists
2025-10-31 15:14:35.912 UTC [63] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database “discourse” already exists
2025-10-31 15:14:36.060 UTC [66] postgres@discourse ERROR:  role “discourse” already exists
2025-10-31 15:14:36.060 UTC [66] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role “discourse” already exists
NOTICE:  extension “hstore” already exists, skipping
NOTICE:  extension “pg_trgm” already exists, skipping
NOTICE:  extension “vector” already exists, skipping
NOTICE:  version “0.8.1” of extension “vector” is already installed
NOTICE:  extension “hstore” already exists, skipping
NOTICE:  extension “pg_trgm” already exists, skipping
NOTICE:  extension “vector” already exists, skipping
NOTICE:  version “0.8.1” of extension “vector” is already installed
I, [2025-10-31T15:14:37.265035 #1]  INFO – : GRANT
ALTER SCHEMA
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
UPDATE 0

I, [2025-10-31T15:14:37.265325 #1]  INFO – : > echo postgres installed!
I, [2025-10-31T15:14:37.270967 #1]  INFO – : postgres installed!

I, [2025-10-31T15:14:37.271578 #1]  INFO – : > sudo -u postgres createdb b_discourse || exit 0
2025-10-31 15:14:37.380 UTC [104] postgres@postgres ERROR:  database “b_discourse” already exists
2025-10-31 15:14:37.380 UTC [104] postgres@postgres STATEMENT:  CREATE DATABASE b_discourse;
createdb: error: database creation failed: ERROR:  database “b_discourse” already exists
I, [2025-10-31T15:14:37.385149 #1]  INFO – :
I, [2025-10-31T15:14:37.385968 #1]  INFO – : > sudo -u postgres psql b_discourse
I, [2025-10-31T15:14:37.390476 #1]  INFO – : grant all privileges on database b_discourse to discourse;

I, [2025-10-31T15:14:37.515870 #1]  INFO – : > sudo -u postgres createdb c_discourse || exit 0
2025-10-31 15:14:37.625 UTC [111] postgres@postgres ERROR:  database “c_discourse” already exists
2025-10-31 15:14:37.625 UTC [111] postgres@postgres STATEMENT:  CREATE DATABASE c_discourse;
createdb: error: database creation failed: ERROR:  database “c_discourse” already exists
I, [2025-10-31T15:14:37.629387 #1]  INFO – :
I, [2025-10-31T15:14:37.630145 #1]  INFO – : > sudo -u postgres psql c_discourse
I, [2025-10-31T15:14:37.634672 #1]  INFO – : grant all privileges on database c_discourse to discourse;

I, [2025-10-31T15:14:37.758171 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “alter schema public owner to discourse;”’
I, [2025-10-31T15:14:37.876557 #1]  INFO – : ALTER SCHEMA

I, [2025-10-31T15:14:37.877104 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists hstore;”’
NOTICE:  extension “hstore” already exists, skipping
I, [2025-10-31T15:14:37.997465 #1]  INFO – : CREATE EXTENSION

I, [2025-10-31T15:14:37.998029 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists pg_trgm;”’
NOTICE:  extension “pg_trgm” already exists, skipping
I, [2025-10-31T15:14:38.117879 #1]  INFO – : CREATE EXTENSION

2025-10-31 15:14:30.984 UTC [45] LOG:  starting PostgreSQL 15.14 (Debian 15.14-1.pgdg12+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0
-14+deb12u1) 12.2.0, 64-bit
2025-10-31 15:14:30.984 UTC [45] LOG:  listening on IPv4 address “0.0.0.0”, port 5432
2025-10-31 15:14:30.984 UTC [45] LOG:  listening on IPv6 address “::”, port 5432
2025-10-31 15:14:31.055 UTC [45] LOG:  listening on Unix socket “/var/run/postgresql/.s.PGSQL.5432”
2025-10-31 15:14:31.135 UTC [56] LOG:  database system was shut down at 2025-10-31 02:08:49 UTC
2025-10-31 15:14:31.199 UTC [45] LOG:  database system is ready to accept connections
I, [2025-10-31T15:14:35.760150 #1]  INFO – :
I, [2025-10-31T15:14:35.760557 #1]  INFO – : > /usr/local/bin/create_db
2025-10-31 15:14:35.912 UTC [63] postgres@postgres ERROR:  database “discourse” already exists
2025-10-31 15:14:35.912 UTC [63] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database “discourse” already exists
2025-10-31 15:14:36.060 UTC [66] postgres@discourse ERROR:  role “discourse” already exists
2025-10-31 15:14:36.060 UTC [66] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role “discourse” already exists
NOTICE:  extension “hstore” already exists, skipping
NOTICE:  extension “pg_trgm” already exists, skipping
NOTICE:  extension “vector” already exists, skipping
NOTICE:  version “0.8.1” of extension “vector” is already installed
NOTICE:  extension “hstore” already exists, skipping
NOTICE:  extension “pg_trgm” already exists, skipping
NOTICE:  extension “vector” already exists, skipping
NOTICE:  version “0.8.1” of extension “vector” is already installed
I, [2025-10-31T15:14:37.265035 #1]  INFO – : GRANT
ALTER SCHEMA
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
UPDATE 0

I, [2025-10-31T15:14:37.265325 #1]  INFO – : > echo postgres installed!
I, [2025-10-31T15:14:37.270967 #1]  INFO – : postgres installed!

I, [2025-10-31T15:14:37.271578 #1]  INFO – : > sudo -u postgres createdb b_discourse || exit 0
2025-10-31 15:14:37.380 UTC [104] postgres@postgres ERROR:  database “b_discourse” already exists
2025-10-31 15:14:37.380 UTC [104] postgres@postgres STATEMENT:  CREATE DATABASE b_discourse;
createdb: error: database creation failed: ERROR:  database “b_discourse” already exists
I, [2025-10-31T15:14:37.385149 #1]  INFO – :
I, [2025-10-31T15:14:37.385968 #1]  INFO – : > sudo -u postgres psql b_discourse
I, [2025-10-31T15:14:37.390476 #1]  INFO – : grant all privileges on database b_discourse to discourse;

I, [2025-10-31T15:14:37.515870 #1]  INFO – : > sudo -u postgres createdb c_discourse || exit 0
2025-10-31 15:14:37.625 UTC [111] postgres@postgres ERROR:  database “c_discourse” already exists
2025-10-31 15:14:37.625 UTC [111] postgres@postgres STATEMENT:  CREATE DATABASE c_discourse;
createdb: error: database creation failed: ERROR:  database “c_discourse” already exists
I, [2025-10-31T15:14:37.629387 #1]  INFO – :
I, [2025-10-31T15:14:37.630145 #1]  INFO – : > sudo -u postgres psql c_discourse
I, [2025-10-31T15:14:37.634672 #1]  INFO – : grant all privileges on database c_discourse to discourse;

I, [2025-10-31T15:14:37.758171 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “alter schema public owner to discourse;”’
I, [2025-10-31T15:14:37.876557 #1]  INFO – : ALTER SCHEMA

I, [2025-10-31T15:14:37.877104 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists hstore;”’
NOTICE:  extension “hstore” already exists, skipping
I, [2025-10-31T15:14:37.997465 #1]  INFO – : CREATE EXTENSION

I, [2025-10-31T15:14:37.998029 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists pg_trgm;”’
NOTICE:  extension “pg_trgm” already exists, skipping
I, [2025-10-31T15:14:38.117879 #1]  INFO – : CREATE EXTENSION

Pgvector 扩展程序已过时或未在您的某个数据库上设置。我几个月前在几次安装中都遇到了这个问题。解决起来非常简单,只需更新它即可。

进入数据库容器,以 discourse(或您的数据库所有者)身份运行 psql,然后选择每个数据库并运行

ALTER EXTENSION vector UPDATE;

1 个赞

看起来 c_discourse 数据库的扩展所有者不是 discourse 用户 - 你需要检查一下谁是所有者,例如:

discourse_development=# select extname, extowner, usename, extversion from pg_extension JOIN pg_user on pg_extension.extowner = pg_user.usesysid;
 extname  | extowner | usename  | extversion
----------+----------+----------+------------
 vector   |    16385 | michael  | 0.8.0
 unaccent |       10 | postgres | 1.1
 pg_trgm  |       10 | postgres | 1.6
 hstore   |       10 | postgres | 1.8
 plpgsql  |       10 | postgres | 1.0

并以该用户或数据库超级用户身份运行 扩展更新命令

2 个赞

关于如何启动数据库来完成此操作,有什么建议吗?这确实是症结所在。

编辑:我找到的唯一 PostgreSQL 文件是 /13。所以我现在处于一种停滞状态。看起来数据库程序已升级,但数据库文件没有。我做了一些搜索,但没有找到我能确信的方法,除非尝试复制文件并进行操作。

2025-10-31 00:27:40.021 UTC [662] FATAL: 数据库文件与服务器不兼容
2025-10-31 00:27:40.021 UTC [662] DETAIL: 数据目录由 PostgreSQL 版本 15 初始化,这与此版本 13.16 (Debian 13.16-1.pgdg120+1) 不兼容。

您应该能够编辑 app.yml 并使用 postgres 13 模板进行重建,如PostgreSQL 15 更新主题中所述。

然后您可以重建。然后您可以启动容器。然后您可以进入容器。然后您可以进行 pgvectkr 操作。

嗯,这卸载了 15 个并安装了 13 个,但奇怪的是,错误相同。它在过程的更早阶段就中止了。 :frowning:

2025-11-01 15:30:26.522 UTC [2547] FATAL: 数据库文件与服务器不兼容
2025-11-01 15:30:26.522 UTC [2547] DETAIL: 数据目录由 PostgreSQL 版本 15 初始化,这与此版本不兼容
n 13.22 (Debian 13.22-1.pgdg12+1)。

这是失败点:
2025-11-01 15:30:26.522 UTC [2547] FATAL: 数据库文件与服务器不兼容
2025-11-01 15:30:26.522 UTC [2547] DETAIL: 数据目录由 PostgreSQL 版本 15 初始化,这与此版本不兼容
n 13.22 (Debian 13.22-1.pgdg12+1)。

我尝试了 13 模板。问题是数据库已经被 15 修改过,但添加的 2 个多站点迁移似乎是用一个安装程序无法识别的用户添加的。正如我上面所说,我最初添加这些时没有要求用户/密码组合,所以我不知道它们是如何添加到数据库中的。

是否可以在用户/密码选项中添加某个值来满足它们?请记住,我没有添加它们,那么初始脚本在什么情况下添加了它们,而不是 postgres,因为从我看到的输出来看,postgres 是默认用户。

是否可以只注释掉这两个添加的站点以启动数据库,然后也许使用现在正在使用的某种导入方法?

如果你查看 pg 15 的主题,它会告诉你如何重命名仍然包含 pg 13 文件的备份目录。

这是一个很长的帖子,所以请让我确认我看到的是正确的东西。

  1. 使用 13 模板
  2. 将 /shared/postgres_data 移动到类似 /shared/postgres_data.bak 的位置
  3. 将 /shared/postgres_data_old 移动到 /shared/postgres_data

这样就能用旧的数据库运行了吗?

root@main-app:/shared/postgres_data_old# cat PG_VERSION
13
root@main-app:/shared/postgres_data# cat PG_VERSION
15

然后担心

数据库一直是我的弱项。:frowning: 看起来这个结构和我以为的不一样,我以为所有这些东西都在 /var/lib/posgresql 下的某个奇怪的、不透明编号的目录里。

非常感谢你的帮助。有一些论坛上,我看到一些用户时,我都在摇头。 :wink:

如果您正在构建包含捆绑插件的 discourse 版本,无论您使用的是哪个 PostgreSQL 版本,构建都会因缺少 pgvector 扩展而失败。如果您使用的是旧版本的 PostgreSQL,您将面临比最初更多的问题。

希望您在这次升级过程中进行了备份。

我建议在其他地方设置一个新的 discourse 实例并恢复您的备份。这是摆脱这种困境的唯一可靠方法。

您也可以手动完成,但这将需要更多的工作,并且不能保证结果。

昨晚有新版本发布吗? 我好像看到了一些 git pull。 无论如何,使用 13 模板移动数据是有效的。勉强算吧 :wink:
数据库迁移似乎没问题。我找不到“grant error”在那些大量的输出中。但这并不意味着它不存在。我可能需要运行 discourse_doctor,这样我才能有一个可以搜索错误的保存输出。数据库已经启动并运行。现在我的浏览器上显示的是页面错误而不是“bad gateway”。为了完整起见,我会把最后的输出放在这里,但是,如果我找不到之前列出的相同的 grant error,我会开一个新帖。

感谢所有到目前为止提供帮助的人。至少我现在可以访问数据库了。非常感谢所有帮助我走到这一步的人。

非常感激!


== 20240611170904 UpgradePgvector070: migrating ===============================

I, [2025-11-02T15:17:02.281908 #1] INFO -- : Terminating async processes
I, [2025-11-02T15:17:02.282204 #1] INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U p
ostgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 2547
I, [2025-11-02T15:17:02.282450 #1] INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 2644
2025-11-02 15:17:02.289 UTC [2547] LOG: received fast shutdown request
2644:signal-handler (1762096622) Received SIGTERM scheduling shutdown...
2644:M 02 Nov 2025 15:17:02.299 # User requested shutdown...
2644:M 02 Nov 2025 15:17:02.299 * Saving the final RDB snapshot before exiting.
2025-11-02 15:17:02.384 UTC [2547] LOG: aborting any active transactions
2025-11-02 15:17:02.391 UTC [2547] LOG: background worker \"logical replication launcher\" (PID 2562) exited with exit code 1
2025-11-02 15:17:02.452 UTC [2557] LOG: shutting down
2644:M 02 Nov 2025 15:17:02.549 * DB saved on disk
2644:M 02 Nov 2025 15:17:02.549 # Redis is now ready to exit, bye bye...
2025-11-02 15:17:06.304 UTC [2547] LOG: database system is shut down

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate failed with return #&lt;Process::Status: pid 4308
exit 1&gt;
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:inspawn’ exec failed with the params "cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate" bootstrap failed with exit code 1 ** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one. ./discourse-doctor may help diagnose the problem. `

EDIT: Found this in the logs. I’m not going to do anything until I run doctor and search for errors though.
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse LOG: provided user name (postgres) and authenticated user name (discourse) do not match
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse FATAL: Peer authentication failed for user "postgres"
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse DETAIL: Connection matched pg_hba.conf line 89: "local all postgres
peer"

为了结束这个帖子,我运行了 doctor 并找到了 alter 错误。由于数据库正在运行,我在涉及 multisite 的数据库上运行了 alter 命令,重新运行了 build,它们现在已迁移。用户对数据库的访问仍然存在,但我将就此另开一个帖子。

再次感谢大家将我带到这个阶段。

由于我是以 root 用户身份移动它们的,所以我必须更改所有权然后更改文件权限。我没有记录这些,但错误输出会显示出来。

当前问题的链接。

一个帖子已合并到现有主题:升级 v3.5.2 → v3.6.0.beta2 后出现数据库访问问题