你能提供更多细节吗?我也遇到了同样的问题
FIX: install PostgreSQL 15 server in postgres.15 template (#1120)
main ← Ethsim12:fix-postgres-15-template
`postgres.15.template.yml` currently assumes that the PostgreSQL 15 server pack…
你能提供更多细节吗?我也遇到了同样的问题
对于遇到相同问题的人,以下是我所做操作的摘要(由 AI 生成):
临时启动 PG15 → 导出数据库 → 使用 PG18 → 恢复导出的数据
所以,是的,这次升级是基于镜像的。
那么,即使你选择安装旧版本的 Discourse,镜像仍然会强制进行 18 版本的升级吗?
明白了。
我看到你已经修复了,但 ChatGPT 提供的方法虽然解决了错误,却清除了我的数据库,导致实际上没有账户、主题或帖子。
幸运的是,这是一个较新的开发论坛,所以损失不大。
我们非常谨慎,以确保今天不会发生这种情况。在每一步之后,系统都会告诉我这不会删除任何内容,而且我有种印象,我们在同意删除不再需要的内容之前,已经三次确认所有数据都已迁移。
但如果真的出了问题,我唯一会丢失的数据就是主题组件配置。
你好,我有一个数据库相当大的论坛(大约80 GB)。从13版升级到15版时,我更换了服务器,进行了新安装并恢复了数据。
你们也建议采用同样的升级方式吗?(我尝试过直接升级,但遇到了排序规则错误)
该主题前面有工作人员表示:
所以,是的,这是一个可行的选项。
你之前已经说过:
我尝试了直接升级,但遇到了排序规则错误
排序规则错误?现有的 Discourse 是什么版本?
也许可以发布你遇到的错误/控制台输出
一个相当大的数据库(约 80 GB)
但你没有空间不足(建议为现有数据库大小的 2 倍)?
你好,我有空间(250 GB 可用),错误是“排序规则不匹配”,但我猜我的 app.yml 文件中没有 UTF-8 字符串。
那么,即使我选择安装旧版本的 Discourse,镜像仍然会强制升级到 18 吗?
我们尽量在 discourse_docker 镜像中提供合理的默认设置,但不可能涵盖所有可能的使用场景。如果您愿意,可以随意自定义镜像以保留旧版本。
在某种程度上,依赖项的版本反映了我们的托管需求——我们在内部使用基础镜像。这意味着它不会过于陈旧,但也意味着我们只能维护有限数量的组合。
你好,我有一个相当大的数据库(约 80 GB)。在从版本 13 升级到 15 时,我更换了服务器,进行了全新安装,并恢复了数据。
你们仍然推荐这种方法吗?(我尝试过直接升级,但遇到了排序规则错误)
如果您更习惯这种方式,这完全是一种有效的方法。
错误是“排序规则不匹配”,
如果在准备转储旧数据库时生成此警告,则无需担心。我们仅为了运行 pg_dump 而针对旧数据目录启动服务器。当转储恢复到新服务器时,索引会重新创建。
您看到此警告的原因是,在过去几天里,我们发布了一个新版本的基础镜像,将 Debian 从 Bookworm 升级到 Trixie,从而更改了 glibc 版本。基于 libc 提供程序(您可能正在使用)的区域设置在 glibc 升级过程中并不稳定,因此当升级脚本启动 Postgres 服务器以转储您的旧数据时,会显示排序规则不匹配警告。
排序规则不匹配正是我们选择进行转储和恢复而不是运行 pg_upgrade 的全部原因。一旦您的数据库使用带有 builtin 提供程序的 C.UTF-8,glibc 的升级将不再影响排序规则。
如果警告是在准备转储旧数据库时生成的,那就不必担心。
我今晚进行了升级,一切按计划进行。我收到了相同的数据库排序规则警告,但听起来我们应该忽略它们。谢谢。
我尝试在 app.yml 中配置以下内容:
app.yml
templates:
以推迟升级,但我遇到了以下错误:
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/postgresql/15/main/postgresql.conf
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/replace_command.rb:11:in ‘IO.read’
replace failed with the params {“filename” => “/etc/postgresql/15/main/postgresql.conf”, “from” => “data_directory = ‘/var/lib/postgresql/15/main’”, “to” => “data_directory = ‘/shared/postgres_data’”}
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.
我觉得可能是基础容器用错了。你运行过 ./launcher rebuild 吗?这个命令应该会执行 git pull,但你可以试试手动运行 git pull,看看情况会不会有变化。
同样的错误
摘要: sha256:837e8ed4b5916baa36856b842ad84fe262b6b1b5550701f8844b13cc7acad7a5
状态: 已下载 discourse/base:2.0.20260812-0036 的新镜像
docker.io/discourse/base:2.0.20260812-0036
正在确保 launcher 为最新版本
Launcher 已是最新版本
正在停止旧容器
Errno::ENOENT: 没有那个文件或目录 @ rb_sysopen - /etc/postgresql/15/main/postgresql.conf
失败位置: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/replace_command.rb:11:in ‘IO.read’
替换失败,参数为 {“filename” => “/etc/postgresql/15/main/postgresql.conf”, “from” => “data_directory = ‘/var/lib/postgresql/15/main’”, “to” => “data_directory = ‘/shared/postgres_data’”}
引导 (bootstrap) 以退出代码 1 失败
** 引导失败 (FAILED TO BOOTSTRAP) ** 请向上滚动查找早期的错误消息,可能不止一个。
./discourse-doctor 可能有助于诊断问题。
2d15a756bfd82ed45debfbb4936784721293a3aeecabe8ba9b58c64d4bbe16e1
同样的错误
我认为我找到了原因。
当前的基础镜像安装了 PostgreSQL 18 服务器,但 postgres.15.template.yml 仍然假设 PostgreSQL 15 服务器软件包已经存在。因此,在 /etc/postgresql/15/main/postgresql.conf 文件存在之前,脚本就尝试访问它,从而产生了上述的 ENOENT 错误。
我提交了一个小的 PR,该 PR 让 PostgreSQL 15 的保留模板在配置 PostgreSQL 之前,先移除 PostgreSQL 18 服务器软件包并安装 PostgreSQL 15 服务器软件包:
main ← Ethsim12:fix-postgres-15-template
`postgres.15.template.yml` currently assumes that the PostgreSQL 15 server pack…
这应该能恢复预期的路径,即通过将 postgres.template.yml 更改为 postgres.15.template.yml 来推迟 PostgreSQL 18 的升级。
更新已发布吗?
我什么时候可以重试?(仅供参考)
我已经合并了修复(感谢 @Ethsim2!),所以现在你可以再试一次了。
我已经合并了修复(感谢 @Ethsim2!),所以你现在应该可以重新尝试了。
可以了,非常感谢!
那些在同一台服务器上运行多个容器的用户,升级顺利吗?如果这周末我有时间,我可能会升级我们的服务器——只是先在这里问问,看看我是不是现在先别急着升级。
是的,几周前我在一台服务器上对双容器进行了升级(在俄罗斯的一台服务器上也是)。完全没有问题,但请先确保你有足够的磁盘空间。
给那些在 Docker 之外执行 PostgreSQL 更新的人一个小技巧:你可以在 pg_upgrade 中使用 --link 参数,这样就不必复制数据,而是可以直接硬链接数据。这样可以节省磁盘空间。