J’essaie de restaurer une base de données créée sur \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e
et de restaurer sur Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e. Les deux utilisent RDS Postgres 13.7. La base de données non compressée fait 126 Go, donc après avoir passé quelques jours à croire que j’avais besoin d’un disque de 200 Go pour effectuer cette restauration de la base de données compressée de 30 Go, j’obtiens ceci :
...
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'
...
La recherche de "entity2char" already exists ne donne rien et je ne vois pas entity2char dans le cœur ou dans l’un des plugins. Et je ne le vois pas non plus dans retort, que j’espérais pouvoir blâmer, mais sa suppression n’a pas aidé.
Quelle est l’histoire de ce forum ? Sur quelles versions de postgres et de Discourse a-t-il démarré ? A-t-il déjà été hébergé chez Bitnami ou l’un de ces hébergeurs douteux ?
On dirait que la sauvegarde de la base de données contient une référence à une fonction entity2char pour une raison quelconque. La supprimer devrait la faire fonctionner, sauf s’il y a d’autres éléments dans la sauvegarde qui ne devraient pas s’y trouver.
J’étais à quelques secondes de le supprimer de la base de données, car il semble beaucoup plus facile de faire ce que SQL a pour
drop function entity2char;
J’ai pu les lister avec \df
Pensez-vous que si je le supprime de la base de données, cela cassera quelque chose ?
Attendez… Et le but de cet exercice de restauration de la base de données de production sur la nouvelle image que je souhaite lancer est de m’assurer que Discourse fonctionnera avec la base de données de production existante lorsque j’installerai la dernière version de Discourse et migrerai la base de données, donc modifier la base de données afin de la restaurer sur staging n’a pas de sens.
Ce qui POURRAIT fonctionner, c’est que vous essayiez de renommer la fonction dans l’instance de base de données cible juste avant la restauration. Mais je n’ai pas testé cela.
Donc (sur la base de données cible)
ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
restaurer
ALTER FUNCTION entity2char RENAME TO e2c_from_backup
ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
Oh ! Donc le problème est que la base de données de staging a déjà cette fonction, et la sauvegarde a aussi cette fonction et elle est trop stupide pour comprendre que c’est la même fonction.
Peut-être que je devrais simplement supprimer et créer la base de données sur le site de staging/cible ?
Mais votre idée semble un peu plus facile.
EDIT : OK, j’ai renommé la fonction et je suis en train de faire la restauration. Dans environ une heure, je pourrai voir si cela a fonctionné.
Et la préoccupation est que d’une manière ou d’une autre la fonction entity2char qui est incluse dans la sauvegarde ne fonctionnera pas avec la base de données existante ? Peut-être que je devrais simplement créer une nouvelle base de données vierge et y restaurer. Je ne suis de toute façon pas un grand fan du nom xx-discourse-database-5.
EDIT : Eh bien, il semble qu’il y ait d’autres taupes que je devrai écraser.
ERROR: function "replace_mentions" already exists with same argument types
Peut-être que commencer avec une nouvelle base de données est la bonne solution.
La solution consistait à supprimer, créer et migrer la base de données avant d’effectuer la restauration. J’aurais dû essayer de sauter l’étape de migration.
Merci pour votre aide, @RGJ et @gerhard. Vos indices m’ont aidé à comprendre cela.
Je suppose que la raison pour laquelle il ne faut pas toujours supprimer la base de données d’abord est que l’on ne peut pas revenir en arrière en cas d’échec.