Beim Upgrade auf 3.1.0.beta4 ist folgender Fehler aufgetreten:
I, [2023-04-19T00:02:26.057232 #1] INFO -- : > cd /var/www/discourse & su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2023-04-19T00:02:27.340128 #1] INFO -- : discourse-adplugin ist bereits in der neuesten kompatiblen Version
discourse-cakeday ist bereits in der neuesten kompatiblen Version
discourse-formatting-toolbar ist bereits in der neuesten kompatiblen Version
discourse-whos-online ist bereits in der neuesten kompatiblen Version
docker_manager ist bereits in der neuesten kompatiblen Version
vbulletin-bbcode ist bereits in der neuesten kompatiblen Version
I, [2023-04-19T00:02:27.340368 #1] INFO -- : > cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
2023-04-19 00:02:30.080 UTC [634] discourse@discourse FEHLER: duplicate key value violates unique constraint "index_users_on_username"
2023-04-19 00:02:30.080 UTC [634] discourse@discourse DETAIL: Key (username)=(xxx) already exists.
2023-04-19 00:02:30.080 UTC [634] discourse@discourse STATEMENT: UPDATE users SET password_algorithm = '$pbkdf2-sha256$i=64000,l=32$'
WHERE id IN (
SELECT id FROM users
WHERE users.password_hash IS NOT NULL
AND users.password_algorithm IS NULL
LIMIT 5000
)
rake aborted!
StandardError: Ein Fehler ist aufgetreten, alle nachfolgenden Migrationen wurden abgebrochen:
PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_username"
DETAIL: Key (username)=(xxx) already exists.
Nachdem die doppelten Benutzer behoben wurden, treten erneut neue auf.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(mhm) is duplicated.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(ahmedhafez) is duplicated.
CONTEXT: parallel worker
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(hany) is duplicated.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(eng_ali) is duplicated.
CONTEXT: parallel worker
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(saad_saad) is duplicated.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(eng_ali) is duplicated.
CONTEXT: parallel worker
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(mostafa11) is duplicated.
CONTEXT: parallel worker
Das sieht entweder nach einem beschädigten Index oder danach aus, dass Benutzer irgendwie Konten mit demselben Benutzernamen, aber unterschiedlicher Groß-/Kleinschreibung erstellen konnten aus.
Sie sollten den alten Container mit
./launcher start app
starten können.
Sie können dann versuchen, die Tabelle neu zu indizieren, zu sehen, welcher Benutzer defekt ist, ihn zu beheben und zu wiederholen, bis der Index neu erstellt wurde.
Ja, ich kann die App starten / betreten, und ich mache auch, was Sie vorgeschlagen haben.
discourse=# REINDEX TABLE users;
ERROR: could not create unique index "index_users_on_username_lower"
DETAIL: Key (username_lower)=(mostafa11) is duplicated.
Das Problem ist, dass Duplikate immer wieder auftreten. Ich habe über 300.000 Benutzer.
Gibt es eine Möglichkeit, die Anzahl der Duplikate zu überprüfen oder sie alle aufzulisten?
Zur Behebung habe ich username_lower wie folgt aktualisiert: Ich habe am Ende eine Zahl angehängt.
UPDATE users SET username_lower = 'xxx' WHERE id = xxx;
Muss ich auch die Spalte username aktualisieren, damit sie mit username_lower übereinstimmt? Gibt es eine schnellere Möglichkeit, z. B. die automatische Behebung dieser Duplikate?
Meine Website ist jetzt offline, daher ist jede Hilfe sehr willkommen.
Davon weiß ich nichts. Das sollte eigentlich nicht passieren. Von welcher Version aktualisieren Sie?
Vielleicht können Sie nach Benutzern suchen, bei denen username != username_lower ist?
Sie ist ausgefallen, obwohl Sie die App gestartet haben?
Nein. Es ist in Ordnung, wenn ein Benutzername gemischte Groß- und Kleinschreibung hat, aber Sie möchten nicht zwei Benutzernamen haben, die die gleichen Buchstaben enthalten.
Ist es so, dass Sie sowohl einen Joe als auch einen joe haben? Wenn ja, dann gibt es meiner Meinung nach eine Abfrage, die sie finden könnte, aber ich weiß im Moment nicht, wie das geht.
Danke Jay
Ich konnte meine Website wieder aufbauen und online stellen.
Zuerst, wie Sie vorgeschlagen haben, besteht die Lösung darin, neu zu indizieren, zu reparieren und zu wiederholen, bis alles erledigt ist. Ich habe den folgenden Befehl verwendet, um zu sehen, wie viele
SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;
es ergab null.
Natürlich gibt es viele Duplikate und ich wollte wissen, wie viele. Also habe ich die Abfrage leicht angepasst:
SELECT username_lower, count(username) from users GROUP by username_lower HAVING count(username) > 1;
Dies funktionierte und gab etwa 50 Duplikate zurück, also habe ich sie behoben, neu indiziert und erfolgreich neu aufgebaut.