Restaurar fallido `entity2char ya existe' RDS Postgres 13.7

Estoy intentando restaurar una base de datos creada en \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e
y restaurarla en Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e. Ambas usan RDS Postgres 13.7. La base de datos sin comprimir tiene 126 GB, así que después de pasar un par de días creyendo que necesitaba un disco de 200 GB para ejecutar esta restauración de la base de datos comprimida de 30 GB, obtengo esto:

...
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'
...

Buscar \"entity2char\" already exists no encuentra nada y no veo entity2char en el núcleo ni en ninguno de los plugins. Y tampoco lo veo en retort, que esperaba culpar, pero eliminarlo no ayudó.

Aquí están los 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

Y traté de buscar una función entity2char en la base de datos donde hice la copia de seguridad y no pude encontrar ninguna.

¿Cuál es la historia de este foro? ¿En qué versión de postgres y Discourse comenzó? ¿Estuvo alguna vez en Bitnami o en alguno de esos hosts poco fiables?

1 me gusta

Parece que el volcado de la base de datos contiene una referencia a una función entity2char por alguna razón. Eliminarla debería hacer que funcione, a menos que haya otras cosas en el volcado que no deberían estar allí.

1 me gusta

¿Tienes alguna pista sobre cómo eliminarlo de la base de datos existente? Mi primera pista de Google no funcionó.

No lo elimines de la base de datos, elimínalo de la copia de seguridad.

Estuve a segundos de eliminarlo de la base de datos, ya que parece mucho más fácil hacer lo que sea que SQL tenga para

   drop function entity2char;

Pude listarlos con \df
¿Crees que si lo elimino de la base de datos, romperá algo?
Espera… Y el propósito de este ejercicio de restaurar la base de datos de producción en la nueva imagen que me gustaría lanzar es asegurarme de que Discourse funcionará con la base de datos de producción existente cuando instale la última versión de Discourse y migre la base de datos, por lo que modificar la base de datos para restaurarla en staging no tiene sentido.

Sí, exactamente esto

y esto :wink:

Lo que PODRÍA funcionar es que intentes renombrar la función en la instancia de base de datos de destino justo antes de restaurarla. Pero no lo he probado.

Así que (en la base de datos 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 me gusta

¡Oh! Entonces el problema es que la base de datos de staging ya tiene esa función, y la copia de seguridad también tiene esa función y es demasiado estúpida para entender que es la misma función.

¿Quizás debería simplemente eliminar y crear la base de datos en el sitio de staging/destino?

Pero tu idea parece un poco más fácil.

EDITAR: OK, renombré la función y estoy haciendo la restauración ahora. En aproximadamente una hora podré ver si funcionó.

Y la preocupación es que de alguna manera la función entity2char que se incluye en la copia de seguridad no funcionará con la base de datos existente. Quizás debería crear una base de datos nueva y restaurar en ella. De todos modos, no soy un gran fan del nombre xx-discourse-database-5.

EDITAR: Bueno, parece que hay algunos topos más que tendré que aplastar.

ERROR:  function "replace_mentions" already exists with same argument types

Quizás empezar con una nueva base de datos sea el camino a seguir.

La solución fue eliminar, crear y migrar la base de datos antes de restaurarla. Debería haber intentado omitir el paso de migración.

Gracias por tu ayuda, @RGJ y @gerhard. Tus pistas me ayudaron a resolver esto.

Supongo que la razón para no eliminar siempre la base de datos primero es que no puedes dar marcha atrás cuando falla.

1 me gusta