Toast-Indizes können auf diese Weise nicht gelöscht werden.
Ich musste folgendes tun:
su postgres
psql
\connect discourse
drop index pg_toast.pg_toast_309322_index_ccnew;
drop index pg_toast.pg_toast_309322_index_ccnew1;
Das obige gilt nur für pg_toast, da der Discourse-Benutzer keinen Zugriff auf diesen Index hat. PG::InsufficientPrivilege: ERROR: permission denied for schema pg_toast
Ich habe das Äquivalent in Data-Explorer ausgeführt. Das war etwas einfacher zu handhaben.
Was ich getan habe, war, alle ccnew/ccnew1/ccnew2…ccnewn-Indizes zu entfernen und den Index neu zu erstellen. Das hat bei mir funktioniert.
ccnew ist eine PostgreSQL-Funktion zum Markieren von Indizes, und ich denke, es ist eine gewisse Ineffizienz im Prozess, die dazu führt, dass diese übrig bleiben, wenn die Indexierung aus irgendeinem Grund fehlschlägt.
Ich kann nur empfehlen, zunächst die Grundursache des Problems zu beheben. Ich hatte doppelte Tags, die ich löschen musste, bevor ich mit dem Entfernen der Indizes fortfahren konnte. Wenn auch nur ein einziges doppeltes Tag übrig bleibt, wird die Indexierung nicht ordnungsgemäß durchgeführt und ein weiterer ccnew'n'-Index erstellt, was zum Fehler führt.
Du hast recht, ich habe immer noch Duplikate – ich kann die nicht-ccnew-Indizes nicht nicht-parallel neu aufbauen. Ich muss diese doppelten Zeilen entfernen.
discourse=# reindex index index_incoming_referers_on_path_and_incoming_domain_id;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/search/, 3433) is duplicated.
discourse=# reindex index index_incoming_referers_on_path_and_incoming_domain_id;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1861) is duplicated.
Das wirklich Seltsame ist, dass ich in incoming_referers nur eine Zeile mit jedem dieser incoming_domain_id-Werte sehe. Warum sind sie dann dupliziert?
discourse=# select * from incoming_referers where path='/search/' AND incoming_domain_id IN (1861,3433);
id | path | incoming_domain_id
-------+----------+--------------------
42845 | /search/ | 1861
40763 | /search/ | 3433
(2 rows)
@sam oder @riking, soll ich diese beiden Zeilen wie folgt löschen:
DELETE FROM incoming_referers WHERE path='/search/' AND incoming_domain_id IN (1861,3433);
… Ich lerne anscheinend doch noch PostgreSQL, haha.
Glauben Sie es oder nicht, noch mehr Fehler. Beim ersten Durchlauf habe ich einen weiteren doppelten Schlüssel auf /m/search gefunden, der aus irgendeinem Grund vom %/search/-Wildcards nicht erkannt wurde, und diesen gelöscht. Ich habe erneut indiziert (jedes Mal dauerte es fast eine Stunde!), und es traten weitere Fehler auf, die einen doppelten Schlüssel auf users(username_lower) anzeigten.
discourse=# reindex index index_users_on_username_lower;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(john_smith) is duplicated.
Aber das Besondere ist: Es gab nur eine Zeile mit username_lower=john_smith! Zeit für den Detektivhut.
Beim Blick auf die Forum-Admin-Oberfläche stellten wir fest, dass es zwei separate Benutzer mit den Namen „john_smith
Es ist wahrscheinlicher, dass die PostgreSQL-Indexkorruption bei einem zukünftigen PostgreSQL-Upgrade aufhört, falls Peter eine konsistente Reproduktion erhält.
Wenn ein paralleler REINDEX aufgrund ungültiger Daten in der Tabelle fehlschlägt, müssen Sie Folgendes tun:
Die ungültigen Daten beheben, wie es hier geschehen ist.
Die ungültigen Indizes mit folgender Abfrage auflisten: SELECT pg_class.relname FROM pg_class, pg_index WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid;
Jeden der oben aufgeführten ungültigen Indizes mit DROP INDEX <indexname>; löschen.
Nach dem Upgrade auf 2.5.0beta5 und der Befolgung der Anweisungen nach dem Update zum Neuindizieren der Datenbank erhalte ich Folgendes:
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_plugin_store_rows_on_plugin_name_and_key_ccnew"
DETAIL: Key (plugin_name, key)=(discourse-data-explorer, q:-10) is duplicated.
Ich möchte hier lieber nicht experimentieren… wie kann ich die Duplikate sicher löschen?
Nein. Das Upgrade beschädigt Ihren Index nicht, es zeigt lediglich an, dass Ihr Index beschädigt ist. Sie können dies überprüfen, indem Sie versuchen, Ihr Backup auf einem anderen Server wiederherzustellen (auch auf einem, auf dem pg10 läuft). Oder versuchen Sie, Ihren Index auf Ihrer bestehenden Installation neu zu erstellen. Es ist unklar, was die beschädigten Indizes verursacht, aber es besteht die Hoffnung, dass dies bei pg12 weniger wahrscheinlich ist.
Es gibt einige Leistungsverbesserungen durch das Upgrade, aber es ist keine schlechte Idee, damit zu warten.