Ich versuche, ein Forum auf einen neuen Server zu migrieren. Beide Server laufen mit der neuesten Version von Discourse Docker. Beim Importieren des Backups über die Kommandozeile erhalte ich folgende Fehlermeldung:
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
EXCEPTION: psql failed: DETAIL: Key (path, incoming_domain_id)=(/search/, 418) is duplicated.
Dies scheint derselbe oder ein ähnlicher Fehler zu sein wie in:
In meinem Fall sind die doppelten Datensätze jedoch im Pfad /search/ und nicht wie im oben verlinkten Thread in /m/search vorhanden.
Ich habe mich mit dem Container auf dem alten Server (./launcher enter app) und in der Rails-Konsole (rails c) verbunden und versucht, nach den doppelten Datensätzen zu suchen mit:
IncomingReferer.where(path: "/search")
und IncomingReferer.where("path LIKE '%/search%'")
Dies führt jedoch zur Anzeige von Hunderten von Datensätzen. Wie kann ich herausfinden, welche Datensätze dupliziert sind und wie kann ich diese sicher löschen und neu aufbauen? Das Forum funktioniert auf dem alten Server derzeit einwandfrei, wir müssen nur auf neue Hardware umziehen.
Ich vermute, das bedeutet, dass Sie einen beschädigten Index haben. Welche Version von Postgres verwenden Sie?
etwa so:
cd /var/discourse
cat shared/standalone/postgres_data/PG*
(Ich kann mich nicht genau an den Dateinamen von Postgres erinnern.)
Sie können hier nach „postgres corrupt index" suchen und ein Thema finden, das ich einmal darüber geschrieben habe, wie man diese fehlerhaften Datensätze findet und löscht.
Im Grunde versuchen Sie, diesen Index neu zu erstellen, löschen die Datensätze, über die er sich beschwert, und versuchen dann erneut, den Index neu zu erstellen, bis er erfolgreich neu erstellt wurde.
Auf dem alten Server gibt es keine Datei namens PG_VERSION. Wie kann ich herausfinden, welche Version dort läuft? Ich habe die Docker-Installation heute auf die neueste Version aktualisiert.
Der neue Server (neu aufgesetzt) läuft mit Postgres V13
cat shared/standalone/postgres_data/PG_VERSION
13
Gibt es ein empfohlenes Vorgehen, wie man das macht?
Ich hatte ein Thema mit einigen Hinweisen, aber ich kann es nicht mehr finden. Seit dem Upgrade auf PostgreSQL 12 ist fast ein Jahr vergangen.
reindex index index_incoming_referers_on_path_and_incoming_domain_id;
Und
ActiveRecord::Base.connection.execute('reindex index index_incoming_referers_on_path_and_incoming_domain_id;')
sind Möglichkeiten, den Index neu aufzubauen. Es wird eine Fehlermeldung ausgegeben, und Sie können dann die fehlerhaften Datensätze löschen. Sie müssen sowohl den Pfad als auch die ID angeben.
DELETE FROM incoming_referers WHERE path LIKE '%/search/' AND id IN (6247);
Dann neu aufbauen
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_20732_index_ccnew" concurrently, skipping
REINDEX
Anschließend habe ich ein weiteres Backup erstellt, auf den neuen Server kopiert und es wurde erfolgreich importiert
Es wäre schön, wenn der Backup-Prozess Duplikate erkennen könnte, um Probleme zu vermeiden. Ich hatte Glück, dass ich Zugriff auf den ursprünglichen Server hatte, der noch lief. Wenn ich ein kaltes Backup wiederhergestellt hätte, wäre dies wahrscheinlich ein größeres Problem gewesen.