Wiederherstellung schlägt fehl wegen der fehlenden chat_mention-Funktion

Ich versuche, von einem aktuellen Server auf einen heute erstellten wiederherzustellen. Es schlägt mit dieser Fehlermeldung fehl. Ich sehe das nirgendwo im Discourse-Code oder im Plugin-Code.

Ich bin mir nicht sicher, was ich als Nächstes tun soll.

                                                                                                                           [20/9694]
FEHLER:  Funktion discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() existiert nicht
AUSNAHME: psql fehlgeschlagen: FEHLER:  Funktion discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() existiert nicht
/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'
script/discourse:157:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.
4 „Gefällt mir“

Ich habe diesen Fehler jetzt sowohl bei dieser neuen Standardinstallation als auch auf einer Business-gehosteten Website gesehen.

2 „Gefällt mir“

Ich habe das interne Bat-Signal aktiviert, wir werden uns das in den nächsten Tagen ansehen.

4 „Gefällt mir“

Gleicher Fehler hier, wenn ich versuche, bei einer Neuinstallation wiederherzustellen, da ich versucht habe, mein Discourse auf einen anderen Server zu verschieben. Keine Lösung gefunden.

1 „Gefällt mir“

Ohhh, ich habe gerade eine Lösung gefunden.

Ich hatte Glück, dass der alte Server noch lief. Also habe ich die App neu aufgebaut, um den alten Server auf die exakt gleiche Version wie die Neuinstallation zu bringen. Dann habe ich über die Kommandozeile ein weiteres Backup erstellt. Als ich dieses Backup auf der Neuinstallation wiederhergestellt habe, hat alles geklappt. Das solltest du auch versuchen. @pfaffman

2 „Gefällt mir“

Das könnte mein Problem an einem Ort lösen. Danke!

Froh, dass ich helfen konnte!

1 „Gefällt mir“

Autsch, das ist mir auch schon passiert. Ich versuche, von einem Produktionssystem auf eine Sandbox/Entwicklungsumgebung wiederherzustellen. Ich habe auch überprüft, ob alle Plugins installiert sind.
Welches andere Plugin verwendet dies? Ich werde mir jetzt den Quellcode ansehen…

Ok, hier ist, was ich getan habe:

  1. Stellen Sie sicher, dass der Ordner /var/discourse/shared leer war oder an einen neuen Ort verschoben wurde, falls wir wiederherstellen müssen.
  2. Eine neue Discourse-Instanz mit ./launcher bootstrap <app> initialisiert.
  3. Versuchte die Wiederherstellung erneut, und sie schlug immer noch mit derselben Fehlermeldung fehl.
  4. Dann, als ich einen Dump meiner funktionierenden Discourse-Instanz machte, fand ich den eigentlichen Befehl, der die Funktion erstellt. Er lautet:
CREATE FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
  BEGIN
    RAISE EXCEPTION 'Discourse: old_notification_id in chat_mention_notifications is readonly';
  END
$$;


ALTER FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() OWNER TO discourse;

Dann habe ich die Wiederherstellung erneut versucht, und alles lief gut!

Jetzt hatte ich das Protokoll, bei dem es fehlschlug, und dachte, ich könnte später darauf zurückkommen, aber die Protokolle werden mit jeder Backup/Restore-Funktion zurückgesetzt.

VERBESSERUNG: Es wäre schön, eine Historie von Backups/Restores zu haben. Vielleicht gibt es eine, und ich weiß nicht, wo sie ist.

HAFTUNGSAUSSCHLUSS: Ich bin kein Support-Mitarbeiter von Discourse, daher werde ich nicht darauf eingehen, wie man zur psql-Befehlszeile gelangt, um die obigen Befehle auszuführen. : :slight_smile:

Das Problem ist, dass eine Migration mit einem älteren Zeitstempel später in tests-passed committet wurde (@nbianca FYI), und dies wird von den Metadaten der Version im Backup nicht erkannt. Ich habe das hier erwähnt.

Das ist die Lösung. Sie müssen entweder den Commit-Hash vom Instanzserver abrufen und Ihre neue Instanz mit diesem Commit erstellen oder die vorhandene Instanz auf die neueste Version aktualisieren, die diese Migration ausführt, und dann ein neues Backup erstellen.

2 „Gefällt mir“

Sagen Sie damit, dass die (aktuelle?) Lösung auf Dauer darin besteht, nur auf denselben Commit (oder tatsächlich auf dieselbe Migration) wiederherzustellen, der das Backup erstellt hat?

Oder wenn beide Versionen über den fehlerhaften Commit hinausgehen, werden wir dann in Ordnung sein?

Ja, aber manchmal können Sie die Quellinstanz nicht aktualisieren. In diesem Fall müssen Sie das Ziel auf denselben Commit wie die Quelle setzen. Dies ist also eine Ausnahme von der regulären Situation, in der Sie bei der Wiederherstellung immer eine implizite Vorwärtsmigration durchführen können.

1 „Gefällt mir“

Ich werde das heute testen, aber meine aktuelle Annahme ist, dass die Wiederherstellung funktioniert, sobald die Zielseite vollständig auf dem neuesten Stand ist.

Es scheint, dass das Problem darin besteht, dass die Versionsprüfung zu Beginn der Wiederherstellung nicht erkennt, dass die Quelle tatsächlich ein neueres DB-Schema als das Ziel hatte.

Ja, das glaube ich auch.

Korrekt, und das passiert, weil die Migration nicht den Zeitstempel des Moments hat, in dem sie committet wurde, sondern den Zeitstempel des Moments, in dem sie generiert wurde. Meistens spielt das keine Rolle, aber in diesem Fall lagen 7 Wochen zwischen diesen beiden Momenten.

1 „Gefällt mir“

Ja, das ist ein unglücklicher Grenzfall. Wir können versuchen, ihn in Zukunft zu vermeiden oder eine abwärtskompatible Lösung zu finden, um zu verhindern, dass er erneut auftritt. Ich glaube jedoch nicht, dass wir in diesem Fall etwas tun können, um ihn zu beheben. Das Schiff ist abgefahren. Was auch immer wir tun, es wird immer erfordern, dass Websitebesitzer ihre Ziel-Website auf die neueste Version aktualisieren.

1 „Gefällt mir“

Korrekt, dies ist ein Problem mit dieser Art von Techniken im Allgemeinen, es ist ein generelles Problem für Ruby on Rails und auch für andere AR-Implementierungen wie PHP Laravel. Und wie Sie sagten, passiert es nicht sehr oft, und sobald man merkt, was vor sich geht, ist es einfach, während der Wiederherstellung damit umzugehen.

2 „Gefällt mir“

Und manchmal will man es einfach nicht.

Es klingt also so, als ob ich mit dem Upgrade der beiden Quell-Websites, an denen ich arbeite, auf der sicheren Seite bin.

Danke nochmal, Richard!

1 „Gefällt mir“

Also, in meinem Szenario war meine Wiederherstellungsumgebung ein paar Versionen neuer als die versicherte, die gesichert wurde. Sollte das dann nicht funktionieren?

Wie alt ist derjenige, bei dem Sie das Backup erstellt haben?

Das war etwas, das ich untersuchen wollte! Einen Moment. Ich wünschte, wir hätten ein Protokoll früherer Backups geführt, oder tun wir das?

Da dies die Sandbox ist, in die wir wiederherstellen, habe ich sie erneut initiiert. Dies ist eine Wiederherstellung von Prod–>Sandbox:

Hier sind die Zahlen aus dem Wiederherstellungsprotokoll:

[2024-10-21 19:49:59]   Aktuelle Version: 20241018031851
[2024-10-21 19:49:59]   Wiederhergestellte Version: 20241011054348