Резервное копирование не выполняется с базой данных Postgres 16 (и всеми версиями PG > 13)

Резервное копирование больше не работает для базы данных PostgreSQL 16 из-за этого коммита, который устанавливает postgresql-client-${PG_MAJOR} вместо postgresql-client

Решает ли это какую-то проблему? Разве клиент psql, поставляемый с ОС, не работал корректно со всеми версиями PostgreSQL?

Я был удивлен, что этот клиент использует PG16 на базе данных Digital Ocean, но мне казалось, что я знаю, что некоторые хостинги 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

Может быть, я могу установить PG_MAJOR в переменной окружения ENV?

Да, похоже, что так.

Из PR:

Я обнаружил эту ошибку, когда резервная копия Discourse была создана с помощью pg_dump версии 17.2, которую невозможно восстановить на кластерах PostgreSQL < 17.2.

Кажется, вы оказались между молотом и наковальней (PostgreSQL: Documentation: 18: pg_dump)

Поскольку pg_dump используется для переноса данных в более новые версии PostgreSQL, выходные данные pg_dump, как правило, можно загрузить в серверы PostgreSQL версии новее, чем версия pg_dump. pg_dump также может выполнять дамп с серверов PostgreSQL старше своей собственной версии. (В настоящее время поддерживаются серверы начиная с версии 9.2.) Однако pg_dump не может выполнять дамп с серверов PostgreSQL новее своей основной версии; он откажется даже от попытки, чтобы не рисковать созданием некорректного дампа. Кроме того, не гарантируется, что выходные данные pg_dump можно загрузить в сервер более старой основной версии — даже если дамп был сделан с сервера этой версии. Загрузка файла дампа в более старый сервер может потребовать ручного редактирования файла дампа для удаления синтаксиса, который не поддерживается старым сервером.

Ой. А я думал, что прочитал PR. Учитывая, что я носитель английского языка с докторской степенью, можно было бы ожидать, что я справлюсь лучше. :person_shrugging:

Нет. Я не могу, так как именно это используется для сборки базового образа.

Так что, похоже, моё исправление — это уже предел возможного, хотя, будь я хитрее, я бы убрал всё, что связано с apt, которое подтягивается через apt-get update.

Представляю, что с этой проблемой столкнутся и другие, ведь часто бывает трудно убедить различных людей и системы, что вам нужен PG13, а не что-то более свежее. И кажется, что уже довольно давно кто-то компетентный говорил, что Discourse работает с PG15.

Спасибо, Ричард!

Сбой резервного копирования происходит без уведомления?

(Я вижу, что моя обычная установка использует версию 13, поэтому я предполагаю, что эта ситуация несколько необычна, хотя, возможно, и не настолько редка.)

Нет, не завершаются. Поэтому это довольно очевидно, и такая ситуация должна возникать только у тех, кто достаточно компетентен для управления собственным PostgreSQL.

Всем привет, сегодня я столкнулся с этой проблемой. Суть в том, что нас уже около 6 дней тревожат уведомления о сбоях резервного копирования, и ключевые строки в логах выглядели так:

[2025-06-14 03:30:20] pg_dump: error: aborting because of server version mismatch
[2025-06-14 03:30:20] pg_dump: detail: server version: 16.9; pg_dump version: 15.12 (Debian 15.12-1.pgdg120+1)

Я запускаю Discourse на Ubuntu на виртуальной машине Digital Ocean, используя рекомендуемое руководство по установке. Однако я использую управляемую базу данных PostgreSQL от Digital Ocean вместо контейнера PostgreSQL. Проверив свою базу данных, я увидел, что там запущен PostgreSQL 16. Я не думаю, что они недавно её обновили (да и в любом случае я не ожидал, что обновление основной версии будет происходить автоматически), но я написал в их поддержку, чтобы перепроверить.

В любом случае, мои исследования привели меня на эту страницу. Я не был уверен, куда именно вставить YAML-код, который опубликовал @pfaffman, поэтому выполнил команды вручную и решил поделиться этим с теми, кто может столкнуться с той же проблемой:

  • 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, о котором вы упоминали в первоначальном сообщении выше, был просто способом сократить множество команд, которые я привёл выше, до одной, но при этом вам всё равно приходилось запускать её вручную каждый раз при обновлении Discourse. Я что-то неправильно понял?