Fehler beim Importieren des Backups: "eindeutiger Index konnte nicht erstellt werden"

Hallo,

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.

1 „Gefällt mir“

Hast du schon versucht, die Admin-GUI zu verwenden?

1 „Gefällt mir“

Nein, ich ging davon aus, dass der Import über die GUI denselben Importprozess aufruft? Ich werde das jetzt ausprobieren.

1 „Gefällt mir“

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.

Gerade habe ich über die GUI importiert, mit exakt demselben Ergebnis:

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.

Ok, ich habe es behoben. Ich habe Folgendes getan:

Container betreten

./launcher enter app

Mit der Datenbank verbinden

su postgres -c 'psql discourse'

Versuchen, Duplikate zu finden

discourse=# select * from incoming_referers where path LIKE '%/search/' ORDER BY incoming_domain_id;

  id  |    path    | incoming_domain_id
------+------------+--------------------
 3339 | /search/   |                 33
 6257 | /search/   |                 91
 1567 | /search/   |                298
 1777 | /search/   |                341
 3010 | /search/   |                418
 6247 | /search/   |                418
 4293 | /search/   |                644
 2899 | /search/   |                653
 3447 | /search/   |                793
 3696 | /search/   |                852
 4395 | /a/search/ |               1050
 6968 | /search/   |               1305
 5634 | /search/   |               1387
 5834 | /search/   |               1437
 6519 | /search/   |               1637
 7127 | /search/   |               1787
 7280 | /search/   |               1827
(17 rows)

Duplikat löschen

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 :smiley:

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.

Vielen Dank für deine Hilfe.

3 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.