PG12でのdb:migrateでリビルドが失敗する

./launcher rebuild app を実行すると db:migrate で失敗します。PostgreSQL v12 を使用しています。

これによりフォーラムが壊れました。Docker コンテナは再起動しましたが、フォーラムは起動しませんでした。幸い、アップグレード前に VM スナップショットを取得していたので、それを復元しています。

ログ:

Tasks: TOP => db:migrate
(See full trace by running task with --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
** 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.
2dcd9aeca614c9e06ef748f673eb68203db6eae5c445253b416d666663879d6d
==================== END REBUILD LOG ====================
Failed to rebuild app.

それらは別々ではなく、外部PGもありません。PG13のアップグレードも失敗します(今日のアップグレードとは異なり、非破壊的です)。正直なところ、ここで修正方法のサポートは得られませんでした。

(確認できませんが)docker psに表示されるコンテナは1つだけだったと思います。標準のインストールは現在2つのコンテナですか?

この拡張機能は、PostgreSQL 13以降で「信頼された」拡張機能として利用可能になり、どのユーザーでも有効化できるようになりました。

古いバージョンのPostgreSQLを実行しているため、Discourseユーザーのためにこの拡張機能をインストールして有効化し、この拡張機能が既にインストールされているとDiscourseに認識させるように試みるなどの回避策が必要になります。または、現在サポートされているバージョンのPostgreSQLに移行することもできます。

「いいね!」 1

要約すると、PG12のサポートを終了するということですね。それをPG13アップグレードのスレッドや、おそらく2.9.0b4の発表にも投稿することをお勧めします。

「いいね!」 1

ダウンタイムが心配な場合は、サーバーを新しいホストにレプリケートするという方法があります。たとえば、community/archived/setting-up-postgres-hot-standby.md at master · GoogleCloudPlatform/community · GitHub のような方法です。(より新しい指示や、より分かりやすい指示が見つかるかもしれません…)。これにより、古いデータベースが機能し続ける一方で、新しいデータベースに移行できます。しかし、それは決して簡単なことではありません。

それは良いアイデアですね。MySQL、MS-SQL、またはOracleであればそうしますが、PostgreSQLの経験が浅いため、ダウンタイムを受け入れることになるでしょう。

「いいね!」 1

復元が4時間以上かかってようやく完了しましたが、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によって所有され、chmod 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に戻そうとしましたが、すべてのプラグインでカーニバル・オブ・ライトになってしまいます。

デフォルトのテンプレートではなく、こちらのPostgreSQLテンプレートで再構築を試しましたか?

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

それは良くないですね。PG12の古いバージョンのDiscourseからのバックアップを、PG13の新しいものに復元できなかったということですか?エラーメッセージなどを投稿していただけますか?ここには誰もが繰り返しそれが機能すると私に保証してくれました。

「いいね!」 1

どのような意味ででしょうか?エラーが発生していますか?

これで問題が解決しました。

CREATE EXTENSION unaccent;

PG をアップグレードする必要はありません。

「いいね!」 1

1年前に知りたかったですが、ありがとうございます!

閲覧している方のために、最終的に新しいVMにクリーンインストールしてフルリストアを行ったところ、問題なく動作しました。

「いいね!」 3