Restaurar falhou `entity2char já existe' RDS Postgres 13.7

Estou tentando restaurar um banco de dados criado em \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e
e restaurar para Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e. Ambos estão usando RDS Postgres 13.7. O banco de dados descompactado tem 126 GB, então, depois de passar alguns dias acreditando que eu precisava de um disco de 200 GB para executar esta restauração do banco de dados compactado de 30 GB, recebo isto:

...
SET
CREATE TYPE
ERROR:  function "entity2char" already exists with same argument types
EXCEPTION: psql failed: ERROR:  function "entity2char" already exists with same argument types
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
...

A busca por \"entity2char\" already exists não encontra nada e eu não vejo entity2char no core ou em nenhum dos plugins. E eu também não o vejo em retort, que eu esperava culpar, mas removê-lo não ajudou.

Aqui estão os plugins:

         - git clone https://github.com/discourse/discourse-adplugin.git
         - git clone https://github.com/discourse/discourse-affiliate.git
         - git clone https://github.com/discourse/discourse-bbcode.git
         - git clone https://github.com/discourse/discourse-canned-replies.git
         - git clone https://github.com/discourse/discourse-data-explorer.git
         - git clone https://github.com/discourse/discourse-prometheus.git
         - git clone https://github.com/discourse/discourse-push-notifications.git
         - git clone https://github.com/discourse/discourse-signatures.git
         - git clone https://github.com/discourse/discourse-user-notes.git
         - git clone https://github.com/discourse/discourse-spoiler-alert.git
         - git clone https://github.com/discourse/discourse-cakeday.git
         - git clone https://github.com/discourse/discourse-checklist.git
         - git clone https://github.com/discourse/discourse-calendar.git
         - git clone https://github.com/discourse/discourse-reactions.git

E eu tentei procurar por uma função entity2char no banco de dados onde fiz o backup e não consegui encontrar nenhuma.

Qual é a história deste fórum? Em qual versão do postgres e Discourse ele começou? Já esteve no Bitnami ou em algum desses hospedadores duvidosos?

1 curtida

Parece que o dump do banco de dados contém uma referência a uma função entity2char por algum motivo. Removê-la deve fazer com que funcione, a menos que haja outras coisas no dump que não deveriam estar lá.

1 curtida

Você tem alguma dica de como removê-lo do banco de dados existente? Minha primeira dica do Google não funcionou.

Não remova do banco de dados, remova do backup.

Eu estava a segundos de excluí-lo do banco de dados, pois parece muito mais fácil fazer o que quer que o SQL tenha para

drop function entity2char;

Consegui listá-los com \df
Você acha que se eu removê-lo do banco de dados, isso quebrará alguma coisa?
Espere. . . . E o objetivo deste exercício de restaurar o banco de dados de produção para a nova imagem que eu gostaria de lançar é garantir que o Discourse funcionará com o banco de dados de produção existente quando eu instalar o último Discourse e migrar o banco de dados, então modificar o banco de dados para restaurá-lo no staging não faz sentido.

Sim, exatamente isso

e isso :wink:

O que PODE funcionar é que você tente renomear a função na instância do banco de dados de destino logo antes de restaurar. Mas eu não testei isso.

Então (no banco de dados de destino)

  • ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
  • restaurar
  • ALTER FUNCTION entity2char RENAME TO e2c_from_backup
  • ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
1 curtida

Ah! Então o problema é que o banco de dados de staging já tem essa função, e o backup também tem essa função e ele é muito “burro” para entender que é a mesma função.

Talvez eu devesse apenas remover e criar o banco de dados no site de staging/destino?

Mas sua ideia parece um pouco mais fácil.

EDIT: Ok, renomeei a função e estou fazendo a restauração agora. Em cerca de uma hora poderei ver se funcionou.

E a preocupação é que, de alguma forma, a função entity2char que é levada junto no backup não funcionará com o banco de dados existente? Talvez eu devesse apenas criar um novo banco de dados e restaurar nele. Eu não sou um grande fã do nome xx-discourse-database-5 de qualquer maneira.

EDIT: Bem, parece que há mais “toupeiras” que terei que eliminar.

ERRO:  função "replace_mentions" já existe com os mesmos tipos de argumento

Talvez começar com um novo banco de dados seja o caminho a seguir.

A solução foi excluir, criar e migrar o banco de dados antes de restaurá-lo. Eu deveria ter tentado pular a etapa de migração.

Obrigado pela ajuda, @RGJ e @gerhard. Suas dicas foram úteis para eu descobrir isso.

Acho que o motivo para não excluir sempre o banco de dados primeiro é que você não pode voltar atrás quando falha.

1 curtida