重建失败,db:migrate w/PG12

运行“./launcher rebuild app”在 db:migrate 时失败。请注意,我们使用的是 PostgreSQL v12。

这导致我们的论坛瘫痪。Docker 容器重新启动了,但论坛没有。幸运的是,我在升级前拍摄了 VM 快照,现在正在恢复它。

日志:

Tasks: TOP => db:migrate
(运行任务时使用 --trace 查看完整跟踪)
I, [2022-04-14T15:20:51.896917 #1]  INFO -- : == 20220304162250 EnableUnaccentExtension: migrating =========
-- enable_extension("unaccent")

I, [2022-04-14T15:20:51.897218 #1]  INFO -- : Terminating async processes
I, [2022-04-14T15:20:51.897265 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main pid: 1710
I, [2022-04-14T15:20:51.897396 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 1827
2022-04-14 15:20:51.897 UTC [1710] LOG:  received fast shutdown request
1827:signal-handler (1649949651) Received SIGTERM scheduling shutdown...
2022-04-14 15:20:51.900 UTC [1710] LOG:  aborting any active transactions
2022-04-14 15:20:51.902 UTC [1710] LOG:  background worker "logical replication launcher" (PID 1719) exited with exit code 1
2022-04-14 15:20:51.904 UTC [1714] LOG:  shutting down
1827:M 14 Apr 2022 15:20:51.913 # User requested shutdown...
1827:M 14 Apr 2022 15:20:51.914 * Saving the final RDB snapshot before exiting.
2022-04-14 15:20:51.965 UTC [1710] LOG:  database system is shut down
1827:M 14 Apr 2022 15:20:53.157 * DB saved on disk
1827:M 14 Apr 2022 15:20:53.157 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 2118 exit 1>
Location of failure: /usr/local/lib/ruby/gems/2.7.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** BOOTSTRAP FAILED ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
2dcd9aeca614c9e06ef748f673eb68203db6eae5c445253b416d666663879d6d
==================== END REBUILD LOG ====================
Failed to rebuild app.

它们不是分开的,也没有外部 PG。PG13 升级也失败了(不像今天的升级那样具有破坏性),而且说实话,我在这里没有得到关于如何修复它的支持。

我相信(显然无法检查)在 docker ps 中只有一个容器显示出来。标准安装现在是 2 个容器吗?

此扩展在 PostgreSQL 13+ 上已成为“受信任”扩展,任何用户都可以启用它。

由于您运行的是较旧的 PostgreSQL 版本,因此您必须通过为 Discourse 用户安装和启用此扩展来解决此问题,并可能尝试欺骗 Discourse 使其认为此扩展已安装。或者升级到当前支持的 PostgreSQL 版本。

1 个赞

好的。总而言之,您不再支持 PG12。建议将此信息发布到 PG13 升级线程的某个位置,可能还有 2.9.0b4 的公告中。

1 个赞

如果您担心停机时间,一个解决方案是将服务器复制到新主机。例如,可以参考 Get started on Google Cloud with quickstarts, tutorials, checklists, or interactive walkthroughs  |  Google Cloud Documentation

这是一个好主意,如果是 mysql、ms-sql 或 oracle,我会那样做,但鉴于我对 postgres 缺乏经验,我可能会选择接受停机时间。

1 个赞

我的恢复终于完成了,历时四个多小时。Discourse 一直出现 502 错误。这次快照是在升级之前拍摄的,所以这非常奇怪。

查看 nginx 日志后,我发现了这个错误:

2022/04/14 19:36:21 [error] 493#493: *350 connect() failed (111: Connection refused) while connecting to upstream, client: 216.228.112.21, server: _, request: "POST /message-bus/15f7a893581d489e930634c8f3ed1134/poll?dlp=t HTTP/2.0", upstream: "http://127.0.0.1:3000/message-bus/15f7a893581d489e930634c8f3ed1134/poll?dlp=t", host: "forum.quartertothree.com", referrer: "https://forum.quartertothree.com/c/movies/8"

然后在 ruby 日志中,

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require': cannot load such file -- /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb (LoadError)

果然,这个文件属于 root:root,并且权限是 0000。将其更改为 discourse:root 和 644,使其与其他文件匹配,我们就恢复了正常运行。呼!

您知道这个文件是如何被删除/更改的吗?它的大小也是 0 字节,非常奇怪。

root@forum-app:/shared/log/rails# ls -la /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
-rw-r--r-- 1 discourse root 0 Feb 10 17:41 /var/www/discourse/lib/freedom_patches/schema_cache_concurrency.rb
1 个赞

这个 :point_up:

现在我们又面临“空间不足,因为升级需要 300GB”的问题了。

祝你好运。据我所知,除了将备份恢复到新的主机之外,没有真正的解决方案。

谢谢,但基本上已经报废了。

尝试执行“恢复到全新安装”,但它不起作用,PG 不配合。尝试降级 discourse 版本并回退到 PG12,但随后所有插件都会出现各种问题。

您是否尝试使用此 postgres 模板而不是默认模板进行重建?

discourse_docker/templates/postgres.12.template.yml at main · discourse/discourse_docker · GitHub

1 个赞

首先:感谢您的帮助。

是的,我确实更改了模板,这是“好吧,这行不通”策略的一部分,这样我就可以回到 PG12(尽管这让我怀疑我该如何升级 PG :thinking:)。

我不得不“寻找”一个特定的提交,但显然这个提交是安全的:Version bump to v2.8.0.beta10 (#15382) · discourse/discourse@07c0104 · GitHub

我尝试了最近的提交,但仍然存在 enable_extension("unaccent") 错误,这暗示在那些提交中,依赖它的更改已经完成。

等待这次尝试的结果。

更新:不行,在“解压转储”阶段恢复时失败了,现在又挂了。

您好,如果您有 discourse 的备份,我建议您先在另一个服务器上尝试操作。

我相信您是在升级运行旧版本的 discourse 实例时遇到此问题的。

因此,请尝试安装 discourse 的副本,手动编辑 yml 文件以使用 discourse “stable” 并将 postgres 版本固定为 12。

如果构建成功,请尝试恢复备份。希望它能成功恢复。
如果成功,请将 postgres 12 模板改回默认的 postgres 模板,并注释掉 stable 标签,以便 discourse 使用最新的 tests-passed 进行重建。

我相信如果备份可以挽救,它应该能够经受住 postgres 和 discourse 的升级。

如果您遇到任何问题,请告诉我。

2 个赞

我现在基本上处于“停滞不前”的状态。我尝试了您关于 PG12 和“Stable”的建议。它不起作用,恢复就停止了。所以我将再次擦除机器以全新开始,因为现在它无法进行应用程序重建。

当那台机器尝试“回到 PG12”时,我正试图看看是否可以在另一台机器上取得进展:如果我尝试通过全新安装升级 PG,它会在 Creating missing functions in the discourse_functions schema...(开始返回 500)之后失败,并且 tail -f shared/data/log/var-log/postgres/current 显示数据容器正在“移动”,尽管里面充满了像这样的“错误”:

discourse@discourse ERROR:  relation "user_auth_tokens" does not exist at character 34
discourse@discourse STATEMENT:  SELECT "user_auth_tokens".* FROM "user_auth_tokens" WHERE ((auth_token = 'XXXX=' OR
                                  prev_auth_token = 'XXXX=') AND rotated_at > '2022-03-09 10:21:44.051357') LIMIT 1
discourse@discourse ERROR:  relation "application_requests" does not exist at character 41
discourse@discourse STATEMENT:  SELECT "application_requests"."id" FROM "application_requests" WHERE "application_requests"."date" = '2022-05-08' AND "application_requests"."req_type" = 0 LIMIT 1

然而,尽管 Discourse 可能已停止运行,但机器正在被使用,所以……它是否正在工作但只是需要数小时的等待?因为我让它运行了 1 个多小时,但没有任何变化。

此时我已经开始考虑这是否应该发到 这里,哈哈。

附注:我尝试了 2 个不同的备份,因为我在这次冒险之前创建了 2 个备份。

我不明白你说的“就是停止了”是什么意思。你遇到了什么错误吗?屏幕冻结了吗?还是其他情况?

1 个赞

那可不好——所以你无法将旧版 Discourse (PG12) 的备份恢复到新版 (PG13) 中吗?你能发布错误消息等信息吗?这里所有人都一再向我保证那会奏效。

1 个赞

什么意思?有错误吗?

这解决了问题:

CREATE EXTENSION unaccent;

无需升级 PG

1 个赞

一年前知道就好了,不过还是谢谢!

供潜水的各位参考,我们最终在新的虚拟机上进行了全新安装的完整恢复,一切运行正常。

3 个赞