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.
The old server doesn’t have a file called PG_VERSION, how can I tell what version its running? I’ve updated the docket install to the latest version today.
The new server (newly bootstrapped) is running postgres V13
cat shared/standalone/postgres_data/PG_VERSION
13
Is there a recommended procedure on how to do this?
I had a topic that had some hints, but I don’t see it anymore. It’s been close to a year since the postgres 12 upgrade.
reindex index index_incoming_referers_on_path_and_incoming_domain_id;
And
ActiveRecord::Base.connection.execute('reindex index index_incoming_referers_on_path_and_incoming_domain_id;')
Are ways to try to rebuild the index. It’ll give you an error and you can then go and delete the errant records. You’ll need to include both the path and the ID.
DELETE FROM incoming_referers WHERE path LIKE '%/search/' AND id IN (6247);
Then rebuild
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
Then I took another backup, copied it to the new server, and it imported successfully
It would be nice if the backup process could spot duplicates to avoid any issues, I was luckily that I had access to the original server which was still running. If I was restoring a cold backup, this would probably have been more of an issue>