Fehlgeschlagene Wiederherstellung `entity2char existiert bereits' RDS Postgres 13.7

Ich versuche, eine Datenbank wiederherzustellen, die auf \"Discourse 2.9.0.beta10 - https://github.com/discourse/discourse version 8d3fe3ddc5d38ab02a8f5c6aed7ebf7a6bcfbfec\"\u003e erstellt wurde und auf Discourse 2.9.0.beta12 - https://github.com/discourse/discourse version d4371a9ffcc6c727105a880b4b70c715ed0283cb\"\u003e wiederherzustellen. Beide verwenden RDS Postgres 13.7. Die unkomprimierte Datenbank ist 126 GB groß. Nachdem ich ein paar Tage lang glaubte, ich bräuchte eine 200-GB-Festplatte, um diese Wiederherstellung der 30-GB-komprimierten Datenbank durchzuführen, erhalte ich Folgendes:

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

Die Suche nach "entity2char" already exists liefert keine Ergebnisse, und ich sehe entity2char weder im Kern noch in einem der Plugins. Und ich sehe es auch nicht in retort, dem ich die Schuld geben wollte, aber das Entfernen hat nichts geholfen.

Hier sind die 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

Und ich habe versucht, nach einer entity2char-Funktion in der Datenbank zu suchen, von der ich das Backup gemacht habe, und konnte keine finden.

Was ist die Geschichte dieses Forums? Auf welcher PostgreSQL- und Discourse-Version wurde es gestartet? War es jemals auf Bitnami oder einem dieser zwielichtigen Hoster?

1 „Gefällt mir“

Es scheint, dass der Datenbank-Dump aus irgendeinem Grund einen Verweis auf eine entity2char-Funktion enthält. Wenn Sie diese entfernen, sollte es funktionieren, es sei denn, es gibt noch andere Dinge im Dump, die nicht dort sein sollten.

1 „Gefällt mir“

Haben Sie einen Hinweis, wie ich es aus der vorhandenen Datenbank entfernen kann? Mein erster Google-Hinweis hat nicht funktioniert.

Entfernen Sie es nicht aus der Datenbank, sondern aus dem Backup.

Ich war nur noch Sekunden davon entfernt, es aus der Datenbank zu löschen, da es viel einfacher erscheint, was auch immer SQL für

   drop function entity2char;

hat.
Ich konnte sie mit \df auflisten.
Glaubst du, wenn ich es aus der Datenbank entferne, wird etwas kaputtgehen?
Moment. . . . Und der Sinn dieser Übung, die Produktionsdatenbank auf das neue Image wiederherzustellen, das ich starten möchte, ist sicherzustellen, dass Discourse mit der vorhandenen Produktionsdatenbank funktioniert, wenn ich das neueste Discourse installiere und die Datenbank migriere. Daher ergibt es keinen Sinn, die Datenbank zu ändern, um sie auf Staging wiederherzustellen.

Ja genau das

und das :wink:

Was funktionieren KÖNNTE, ist, dass du versuchst, die Funktion in der Ziel-Datenbankinstanz kurz vor der Wiederherstellung umzubenennen. Aber das habe ich nicht getestet.

Also (in der Ziel-DB)

  • ALTER FUNCTION entity2char RENAME TO e2c_outoftheway
  • wiederherstellen
  • ALTER FUNCTION entity2char RENAME TO e2c_from_backup
  • ALTER FUNCTION e2c_outoftheway RENAME TO entity2char
1 „Gefällt mir“

Oh! Das Problem ist also, dass die Staging-Datenbank diese Funktion bereits hat und das Backup auch diese Funktion hat und sie zu dumm ist, zu verstehen, dass es sich um dieselbe Funktion handelt.

Vielleicht sollte ich die Datenbank auf der Staging-/Ziel-Website einfach löschen und neu erstellen?

Aber Ihre Idee scheint etwas einfacher zu sein.

EDIT: OK, ich habe die Funktion umbenannt und führe jetzt die Wiederherstellung durch. In etwa einer Stunde kann ich sehen, ob es funktioniert hat.

Und die Sorge ist, dass die Funktion entity2char, die im Backup mitgeführt wird, irgendwie nicht mit der vorhandenen Datenbank funktioniert? Vielleicht sollte ich einfach eine neue, frische Datenbank erstellen und dorthin wiederherstellen. Ich bin sowieso kein wirklicher Fan des Namens xx-discourse-database-5.

EDIT: Nun, es sieht so aus, als gäbe es noch ein paar Maulwürfe, die ich verprügeln muss.

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

Vielleicht ist es der richtige Weg, mit einer neuen Datenbank zu beginnen.

Die Lösung bestand darin, die Datenbank zu löschen, neu zu erstellen und zu migrieren, bevor die Wiederherstellung durchgeführt wurde. Ich hätte versuchen sollen, den Migrationsschritt zu überspringen.

Vielen Dank für Ihre Hilfe, @RGJ und @gerhard. Ihre Hinweise waren hilfreich, um dies herauszufinden.

Ich schätze, der Grund, warum man die Datenbank nicht immer zuerst löschen sollte, ist, dass man dann nicht zurücktreten kann, wenn sie fehlschlägt.

1 „Gefällt mir“