Ripristina fallito `entity2char already exists' RDS Postgres 13.7

Sto cercando di ripristinare un database creato su \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e
e ripristinarlo su Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e. Entrambi utilizzano RDS Postgres 13.7. Il database non compresso è di 126 GB, quindi dopo aver passato un paio di giorni credendo che avrei avuto bisogno di un disco da 200 GB per eseguire il ripristino del database compresso da 30 GB, ottengo questo:

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

Cercando \"entity2char\" already exists non trova nulla e non vedo entity2char nel core o in nessuno dei plugin. E non lo vedo nemmeno in retort, che speravo di poter incolpare, ma rimuoverlo non ha aiutato.

Ecco i plugin:

         - 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 ho provato a cercare una funzione entity2char nel database da cui ho effettuato il backup e non sono riuscito a trovarne una.

Qual è la storia di questo forum? Su quale versione di postgres e Discourse è iniziato? È mai stato su Bitnami o su uno di quegli host loschi?

1 Mi Piace

Sembra che il dump del database contenga un riferimento a una funzione entity2char per qualche motivo. Rimuoverla dovrebbe farlo funzionare a meno che non ci siano altre cose nel dump che non dovrebbero esserci.

1 Mi Piace

Hai un suggerimento su come rimuoverlo dal database esistente? Il mio primo suggerimento di Google non ha funzionato.

Non rimuoverlo dal database, rimuovilo dal backup.

Ero a pochi secondi dall’eliminarlo dal database, dato che sembra molto più facile fare quello che SQL ha per

   drop function entity2char;

Sono stato in grado di elencarli con \df
Pensi che se lo rimuovo dal database si romperà qualcosa?
Aspetta. . . . E il punto di questo esercizio di ripristino del database di produzione sulla nuova immagine che vorrei lanciare è assicurarsi che discourse funzioni con il database di produzione esistente quando installerò l’ultima versione di Discourse e migrerò il database, quindi modificare il database per ripristinarlo sullo staging non ha senso.

Sì esattamente questo

e questo :wink:

Ciò che POTREBBE funzionare è che provi a rinominare la funzione nell’istanza del database di destinazione appena prima del ripristino. Ma non l’ho testato.

Quindi (sul db di destinazione)

  • ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
  • ripristina
  • ALTER FUNCTION entity2char RENAME TO e2c_from_backup
  • ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
1 Mi Piace

Oh! Quindi il problema è che il database di staging ha già quella funzione, e anche il backup ha quella funzione ed è troppo stupido per capire che è la stessa funzione.

Forse dovrei semplicemente eliminare e creare il database sul sito di staging/destinazione?

Ma la tua idea sembra un po’ più facile.

EDIT: Ok, ho rinominato la funzione e ora sto eseguendo il ripristino. Tra circa un’ora potrò vedere se ha funzionato.

E la preoccupazione è che in qualche modo la funzione entity2char che viene inclusa nel backup non funzioni con il database esistente? Forse dovrei semplicemente creare un nuovo database e ripristinare su di esso. Non sono un grande fan del nome xx-discourse-database-5 comunque.

EDIT: Beh, sembra che ci siano altre talpe che dovrò schiacciare.

ERRORE:  la funzione "replace_mentions" esiste già con gli stessi tipi di argomento

Forse iniziare con un nuovo database è la strada da percorrere.

La soluzione è stata eliminare, creare ed eseguire la migrazione del database prima di eseguire il ripristino. Avrei dovuto provare a saltare il passaggio di migrazione.

Grazie per il tuo aiuto, @RGJ e @gerhard. I tuoi indizi sono stati utili per capire la soluzione.

Suppongo che il motivo per cui non si elimina sempre prima il database sia che non è possibile annullare l’operazione in caso di errore.

1 Mi Piace