Las copias de seguridad fallan con bases de datos Postgres 16 (y todas las versiones >13 de PG)

Las copias de seguridad ya no funcionan para una base de datos postgres 16 debido a este commit que instala postgresql-client-${PG_MAJOR} en lugar de postgresql-client

¿Esto resuelve un problema? ¿No funcionaba el cliente psql proporcionado por el sistema operativo perfectamente con todas las versiones de postgres?

Me sorprendió que este cliente estuviera usando PG16 en una base de datos de Digital Ocean, pero pensé que sabía que parte del hosting de CDCK estaba usando PG15 ahora.

¿Hay alguna mejor manera de obtener una copia de seguridad que funcione que algo como esto:

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

¿Quizás pueda configurar PG_MAJOR en una variable de entorno?

2 Me gusta

Sí, parece que ese es el caso.

Del PR:

Descubrí este error cuando se realizó una copia de seguridad de Discourse utilizando pg_dump versión 17.2, que no se puede restaurar en clústeres de postgres < 17.2.

Parece que estás entre la espada y la pared aquí (PostgreSQL: Documentation: 18: pg_dump)

Dado que pg_dump se utiliza para transferir datos a versiones más nuevas de PostgreSQL, se puede esperar que la salida de pg_dump se cargue en versiones de servidor de PostgreSQL más nuevas que la versión de pg_dump. pg_dump también puede volcar de servidores de PostgreSQL más antiguos que su propia versión. (Actualmente, se admiten servidores anteriores a la versión 9.2). Sin embargo, pg_dump no puede volcar de servidores de PostgreSQL más nuevos que su propia versión principal; se negará incluso a intentarlo, en lugar de arriesgarse a realizar un volcado inválido. Además, no se garantiza que la salida de pg_dump se pueda cargar en un servidor de una versión principal anterior, ni siquiera si el volcado se realizó desde un servidor de esa versión. La carga de un archivo de volcado en un servidor más antiguo puede requerir la edición manual del archivo de volcado para eliminar la sintaxis no comprendida por el servidor más antiguo.

Oops. Y pensé que había leído el PR. Dado que soy hablante nativo de inglés con un doctorado, pensarías que podría hacerlo mejor. :person_shrugging:

No. No puedo, ya que esto es lo que construye la imagen base.

Entonces, parece que mi solución es lo mejor que se puede conseguir, aunque si fuera más inteligente, eliminaría las cosas de apt que obtengo con apt-get update.

Imagino que otros tendrán este problema, ya que a menudo es difícil convencer a varios humanos y sistemas de que quieres PG13 en lugar de algo más reciente. Y parece que hace bastante tiempo que alguien que sabe dijo que Discourse estaba funcionando con PG15.

¡Gracias, Richard!

1 me gusta

¿Las copias de seguridad fallan silenciosamente?

(Veo que mi instalación normal está usando la versión 13, así que supongo que esta situación es un poco especial, aunque quizás no terriblemente rara).

No lo hacen. Así que es bastante obvio, y solo debería sucederle a personas que saben lo suficiente como para administrar su propio postgres.

1 me gusta

Hola a todos, me encontré con este problema hoy. El síntoma fue que habíamos estado recibiendo alertas durante unos 6 días de que las copias de seguridad estaban fallando, y las líneas de registro clave parecían ser:

[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)

Ejecuto Discourse en Ubuntu en un droplet de Digital Ocean, usando la guía de instalación recomendada. Pero uso la base de datos Postgres administrada de Digital Ocean en lugar de un contenedor de postgres. Mirando mi base de datos, está ejecutando pg 16. No creo que la hayan actualizado recientemente (y de todos modos no esperaría una actualización automática de versión mayor), pero he enviado un correo electrónico a su soporte para verificar.

De todos modos, mi investigación me llevó a esta página. No estaba seguro de dónde poner el YAML que publicó @pfaffman, así que ejecuté los comandos manualmente, y pensé en compartirlo para cualquiera que se encuentre con esto:

  • cd /var/discourse
  • launcher enter app
  • apt list --installed | grep postgres # para confirmar que la versión actualmente instalada es 15
  • apt-get update
  • apt-get remove postgresql-client-15
  • apt-get install postgresql-client-16

Luego activé una copia de seguridad manual en la página de administración de copias de seguridad.

Esto parece haber solucionado temporalmente el problema, pero como señaló @pfaffman, espero que la próxima vez que actualice discourse, vuelva a postgresql-client-15, y las copias de seguridad dejarán de funcionar, requiriendo la intervención manual anterior.

¿Hay alguna solución a este problema aparte de tener que repetir estos pasos cada vez que actualizo discourse?

Creo que en algún lugar aquí proporciono lo necesario para poner esos comandos en tu app.yml.

Puedes mirar las plantillas de postgres para ver ejemplos, tal vez.

Gracias, pero no estoy seguro de entender. Tengo la impresión de que el YAML que mencionaste en la publicación original anterior era simplemente una forma de reducir los comandos del puñado que publiqué anteriormente a uno solo, pero que aún tenías que ejecutarlo manualmente cada vez que actualizas Discourse. ¿He interpretado mal?