Postgres 16データベースでバックアップが失敗する (PG>13も含む)

Postgres 16データベースのバックアップが、postgresql-client-${PG_MAJOR}をインストールする代わりにpostgresql-clientをインストールするこのコミットにより、機能しなくなりました。

これは問題を解決していますか?OS提供のpsqlクライアントは、すべてのPostgresバージョンで問題なく動作していたのではないでしょうか?

Digital OceanデータベースでPG16を使用していることに驚きましたが、一部のCDCKホスティングが現在PG15を使用していることは知っていると思っていました。

次のようなものよりも、機能するバックアップを取得するより良い方法はありますか?

run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - apt-get update && apt-get remove -y postgresql-client-13 && apt-get install -y postgresql-client-16

ENV変数でPG_MAJORを設定できますか?

「いいね!」 2

はい、そのようです。

PRより:

pg_dump バージョン 17.2 を使用して Discourse バックアップが作成された場合に、17.2 未満の PostgreSQL クラスターに復元できないバグを発見しました。

ここでは、まさに板挟みの状況のようですね。(PostgreSQL: Documentation: 18: pg_dump)

pg_dump は PostgreSQL の新しいバージョンにデータを転送するために使用されるため、pg_dump の出力は pg_dump のバージョンよりも新しい PostgreSQL サーバーバージョンにロードできると期待できます。pg_dump は、それ自体のバージョンよりも古い PostgreSQL サーバーからダンプすることもできます。(現在、バージョン 9.2 までのサーバーがサポートされています。)ただし、pg_dump はそれ自体のメジャーバージョンよりも新しい PostgreSQL サーバーからダンプすることはできません。無効なダンプを作成するリスクを回避するため、試行さえ拒否します。また、pg_dump の出力が、古いメジャーバージョンを持つサーバーにロードできることは保証されていません。たとえそのバージョンからダンプが作成された場合でもです。古いサーバーにダンプファイルをロードするには、古いサーバーが理解できない構文を削除するために、ダンプファイルを手動で編集する必要がある場合があります。

おっと。PRを読んだと思ったのに。ネイティブの英語話者で博士号を持っているのに、もっとうまくやれると思ったよ。:person_shrugging:

いや、ベースイメージをビルドしているのがこれだから、できないよ。

だから、私の修正はできる限り良いものに見えるけど、もっと賢ければ apt-get update で取り込む apt のものを削除するだろうね。

他の人もこの問題を抱えるだろうと想像する。なぜなら、PG13 を望んでいて、それより新しいものを望んでいないことを様々な人間やシステムに納得させるのは難しいことが多いからだ。そして、Discourse が PG15 で動作することを知っている人がかなり前に言っていたように思える。

リチャード、ありがとう!

「いいね!」 1

バックアップはサイレントに失敗しますか?

(通常のインストールではバージョン13を使用しているため、これは少し特別な状況であると推測されますが、それほど珍しいことではないかもしれません。)

いいえ、失敗しません。そのため、非常に明白であり、自身のPostgresを管理できる十分な知識を持つ人にのみ発生するはずです。

「いいね!」 1

皆さん、こんにちは。今日、この問題に遭遇しました。症状としては、約6日間バックアップが失敗しているというアラートを受け取っており、主要なログ行は次のようでした。

[2025-06-14 03:30:20] pg_dump: error: サーバーのバージョンが一致しないため中止します
[2025-06-14 03:30:20] pg_dump: 詳細: サーバーバージョン: 16.9; pg_dump バージョン: 15.12 (Debian 15.12-1.pgdg120+1)

私はDiscourseをDigital Oceanのドロップレットで実行されているUbuntuで、推奨されるインストールガイドを使用しています。しかし、Postgresコンテナではなく、Digital OceanのマネージドPostgresデータベースを使用しています。データベースを確認したところ、pg 16が実行されています。最近アップグレードされたとは思いませんが(メジャーバージョンのアップグレードが自動で行われるとは期待していません)、念のためサポートにメールで確認しました。

いずれにせよ、私の調査はこのページにつながりました。@pfaffmanが投稿したYAMLをどこに配置すればよいかわからなかったので、手動でコマンドを実行し、この問題に遭遇した他の人のために共有しようと思いました。

  • cd /var/discourse
  • launcher enter app
  • apt list --installed | grep postgres # 現在インストールされているバージョンが15であることを確認します
  • apt-get update
  • apt-get remove postgresql-client-15
  • apt-get install postgresql-client-16

その後、管理バックアップページで手動バックアップをトリガーしました。

これは一時的に問題を解決したようですが、@pfaffmanが指摘したように、次にDiscourseをアップグレードしたときに postgresql-client-15 に戻り、バックアップが再び機能しなくなる可能性があると予想しています。その場合、上記の手動介入が必要になります。

Discourseをアップグレードするたびにこれらの手順を繰り返す以外に、この問題に対する解決策はありますか?

どこかに、app.ymlにこれらのコマンドを配置するための情報を提供していると思います。

例として、Postgresのテンプレートを見てみてください。

ありがとうございます。しかし、よく理解できません。先ほどの投稿で言及されていた YAML は、私が投稿したいくつかのコマンドを 1 つにまとめるための手段にすぎず、Discourse をアップグレードするたびに手動で実行する必要があるという印象を受けています。誤解していますか?