Backups falham com banco de dados Postgres 16 (e todos PG>13)

Backups não funcionam mais para um banco de dados postgres 16 devido a este commit que instala postgresql-client-${PG_MAJOR} em vez de postgresql-client

Isso está resolvendo um problema? O cliente psql fornecido pelo sistema operacional não estava funcionando bem com todas as versões do postgres?

Fiquei surpreso que este cliente estivesse usando PG16 em um banco de dados Digital Ocean, mas pensei que sabia que parte do hospedagem CDCK estava usando PG15 agora.

Existe alguma maneira melhor de obter um backup funcional do que algo como isto:

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

Talvez eu possa definir PG_MAJOR em uma variável de ambiente?

2 curtidas

Sim, parece que é o caso.

Do PR:

Descobri este bug quando um backup do Discourse foi feito usando pg_dump versão 17.2, que não pode ser restaurado em clusters postgres < 17.2.

Parece que você está entre a cruz e a espada aqui (PostgreSQL: Documentation: 18: pg_dump)

Como o pg_dump é usado para transferir dados para versões mais recentes do PostgreSQL, a saída do pg_dump pode ser esperada para carregar em versões de servidor PostgreSQL mais novas que a versão do pg_dump. O pg_dump também pode extrair de servidores PostgreSQL mais antigos que sua própria versão. (Atualmente, servidores a partir da versão 9.2 são suportados.) No entanto, o pg_dump não pode extrair de servidores PostgreSQL mais novos que sua própria versão principal; ele se recusará a tentar, em vez de arriscar fazer uma extração inválida. Além disso, não é garantido que a saída do pg_dump possa ser carregada em um servidor de uma versão principal mais antiga — nem mesmo se a extração foi feita de um servidor dessa versão. Carregar um arquivo de extração em um servidor mais antigo pode exigir a edição manual do arquivo de extração para remover a sintaxe não compreendida pelo servidor mais antigo.

Oops. E eu pensei que tinha lido o PR. Dado que sou falante nativo de inglês com um PhD, você pensaria que eu poderia fazer melhor. :person_shrugging:

Não. Não posso, já que é isso que constrói a imagem base.

Então, parece que minha correção é tão boa quanto pode ser, embora se eu fosse mais esperto, eu removeria as coisas do apt que eu puxo com o apt-get update.

Imagino que outros terão esse problema, pois muitas vezes é difícil convencer vários humanos e sistemas de que você quer PG13 em vez de algo mais recente. E parece que faz muito tempo que alguém que sabe disse que o Discourse estava funcionando com PG15.

Obrigado, Richard!

1 curtida

Os backups falham silenciosamente??

(Vejo que minha instalação comum está usando a versão 13, então presumo que esta situação seja um pouco especial, embora talvez não terrivelmente rara.)

Eles não falham. Então é bem óbvio, e só deve acontecer com pessoas que sabem o suficiente para gerenciar seu próprio postgres.

1 curtida

Olá a todos, deparei-me com este problema hoje. O sintoma foi que estávamos recebendo alertas há cerca de 6 dias de que os backups estavam falhando, e as linhas de log principais pareciam 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)

Eu executo o Discourse no Ubuntu rodando em um droplet da Digital Ocean, usando o guia de instalação recomendado. Mas eu uso o banco de dados Managed Postgres da Digital Ocean em vez de um contêiner postgres. Olhando para o meu banco de dados, ele está rodando pg 16. Não acho que eles o atualizaram recentemente (e eu não esperaria que uma atualização de versão principal fosse automática de qualquer maneira), mas enviei um e-mail para o suporte deles para verificar.

De qualquer forma, minha pesquisa me levou a esta página. Eu não tinha certeza onde colocar o YAML que @pfaffman postou, então executei os comandos manualmente e pensei em compartilhar para qualquer outra pessoa que se depare com isso:

  • cd /var/discourse
  • launcher enter app
  • apt list --installed | grep postgres # para confirmar que a versão atualmente instalada é 15
  • apt-get update
  • apt-get remove postgresql-client-15
  • apt-get install postgresql-client-16

Em seguida, acionei um backup manual na página de backups do administrador.

Isso parece ter resolvido o problema temporariamente, mas como @pfaffman apontou, eu espero que da próxima vez que eu atualizar o discourse, ele volte para postgresql-client-15, e os backups pararão de funcionar novamente, exigindo a intervenção manual acima.

Existe alguma solução para este problema além de ter que repetir essas etapas toda vez que eu atualizar o discourse?

Acho que em algum lugar aqui eu forneço o material para colocar esses comandos no seu app.yml.

Você pode olhar os templates do postgres para exemplos, talvez.

Obrigado, mas não tenho certeza se entendi. Tenho a impressão de que o YAML que você mencionou na postagem original acima era simplesmente uma forma de reduzir os comandos do punhado que postei acima para um único, mas que você ainda tinha que executá-lo manualmente cada vez que atualiza o Discourse. Interpretei mal?