Hallo, die Wiederherstellung eines Backups schlägt mit folgendem Fehler fehl:
CREATE INDEX
FEHLER: konnte den eindeutigen Index "index_incoming_referers_on_path_and_incoming_domain_id" nicht erstellen
DETAIL: Schlüssel (path, incoming_domain_id)=(/m/search, 25) ist dupliziert.
AUSNAHME: psql fehlgeschlagen: DETAIL: Schlüssel (path, incoming_domain_id)=(/m/search, 25) ist dupliziert.
Dieses Problem mit der Tabelle incoming_referers ist in letzter Zeit bereits einige Male aufgetaucht. Ich bin mir nicht sicher, warum gerade diese Tabelle Probleme verursacht, aber es scheint wahrscheinlich, dass die Probleme zusammenhängen. Vielleicht hat jemand anderes im Discourse-Team Ideen, was zur Erstellung der doppelten Datensätze führen könnte.
Haben Sie noch Zugriff auf die Site, auf der Sie die Sicherungsdatei erstellt haben? Wenn ja, besteht die Lösung darin, den doppelten Datensatz aus der Datenbank zu löschen und anschließend eine neue Sicherungsdatei zu erstellen. Dazu müssten Sie per SSH auf den alten Server zugreifen und in das Verzeichnis /var/discourse wechseln:
cd /var/discourse
Führen Sie dann aus:
./launcher enter app
Geben Sie dann mit folgendem Befehl die Rails-Konsole auf:
rails c
Sie sollten dann eine Eingabeaufforderung sehen, die ähnlich wie diese aussieht:
[1] pry(main)>
Versuchen Sie, den folgenden Befehl aus der Rails-Konsole auszuführen, und teilen Sie uns mit, was er zurückgibt:
IncomingReferer.where(path: "/m/search")
Es sollte ein Array mit zwei oder mehr Datensätzen zurückgegeben werden.
Danke, dass du das überprüft hast! Das Ergebnis, das du erhalten hast, entspricht tatsächlich dem, was ich heute früher auf einer anderen Seite gesehen habe. Es ist ein lösbares Problem, aber ich werde versuchen, einen unserer Ingenieure dazu zu bewegen, sich anzusehen, was los ist.
Mein Hauptgrund für den Umzug der Server war, dass ich Debian 8 nutzte, dessen Support bald ausläuft. Im Zusammenhang mit diesem Wiederherstellungsproblem habe ich mich dafür entschieden, auf demselben Server auf Debian 9 zu aktualisieren. Dies war erfolgreich, was mir vorerst etwas Erleichterung verschafft hat.
Vielen Dank für Ihre Unterstützung.
Sie müssen eine Fuzzy-Suche durchführen, damit nicht davon ausgegangen wird, dass der Index funktioniert. Ein Prozentzeichen reicht wahrscheinlich aus, wenn es am Anfang steht, denke ich.
Sie können den zusätzlichen Eintrag einfach löschen. Um es richtig zu machen, müssen Sie jedoch die andere Tabelle aktualisieren, die mit dieser verknüpft ist. Ich muss es jedes Mal nachschlagen, da es ein paar verschiedene Tabellen gibt, die dies betreffen.
Dieses Problem wird Drittanbieter-Erweiterungen angelastet, was nicht sehr sinnvoll erscheint. Es scheint, als müsste es ein Fehler von PostgreSQL sein, aber ich weiß es nicht. Ich stoße ein paar Mal im Monat darauf, scheint es (Score) über eine Reihe von Sites.
Ich habe ebenfalls ein Problem mit doppelten Schlüsseln. Gibt es eine dokumentierte Lösung?
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
Obwohl ich meinen Server gerade direkt aktualisiert habe und daher nicht mehr auf einen neuen Server wiederherstellen werde, habe ich dies aus Neugier ausprobiert und konnte bei der Fuzzy-Suche keine Einträge finden:
Das ist gut zu hören. Ich habe mühevoll die andere Tabelle aktualisiert, die auf diese verweist. Es ist eine enorme Last, da ich mir nie merken kann, wie sie hieß, also muss ich es immer wieder von vorne machen.
Das Entfernen dieser beiden Duplikate war erfolgreich, aber beim anschließenden Neuaufbau der Indizes traten neue Fehler auf. Ist dies ein schwerwiegendes Problem? Wie beheben wir das und löschen wir diese Zeile mit der Suche 3433?
postgres=# \connect discourse
Sie sind jetzt mit der Datenbank "discourse" als Benutzer "postgres" verbunden.
discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING: cannot reindex invalid index "public.incoming_referers_pkey_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "public.index_incoming_referers_on_path_and_incoming_domain_id_ccnew" concurrently, skipping
WARNING: cannot reindex invalid index "pg_toast.pg_toast_2782645_index_ccnew" concurrently, skipping
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_ccnew1"
DETAIL: Key (path, incoming_domain_id)=(/search/, 3433) is duplicated.
CONTEXT: parallel worker
Hier ist der Code, der die Erstellung verarbeitet… Das sollte es ordnungsgemäß handhaben, aber wir könnten es bei Bedarf auf einen ON CONFLICT-Insert aktualisieren?
Ich habe versucht, diese 4 Indizes manuell neu zu erstellen. Zwei waren erfolgreich, zwei sind fehlgeschlagen. Soll ich diese zwei doppelten Zeilen löschen?
discourse=# REINDEX INDEX CONCURRENTLY "public"."incoming_referers_pkey_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "public"."index_incoming_referers_on_path_and_incoming_domain_id_ccnew";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_cc_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1861) is duplicated.
discourse=# REINDEX INDEX CONCURRENTLY "pg_toast"."pg_toast_2782645_index_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "index_incoming_referers_on_path_and_incoming_domain_id_ccnew1";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_c_ccnew1"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
@riking Das Korruptieren von Indizes in PostgreSQL ist ein PostgreSQL-Fehler, kein Discourse-Fehler. Wir können zwar die Leistung dieses Einfügevorgangs verbessern, aber der PostgreSQL-Fehler muss in PostgreSQL selbst behoben werden.
Meine Vermutung ist, dass dies mit einer Art unsachgemäßem Herunterfahren der Datenbank-Engine zusammenhängt, möglicherweise aufgrund eines Stromausfalls.
Das ist eine plausible Erklärung. Führt ./launcher shutdown app (oder rebuild) eine saubere Abschaltung von PostgreSQL durch oder auf andere Weise? Oh, aber ich wette, dass ein unbeaufsichtigtes Upgrade nicht weiß, wie man Docker-Container sauber herunterfährt, oder?