PG::UniqueViolation Problema durante l'aggiornamento a 3.1.0.beta4

Durante l’aggiornamento a 3.1.0.beta4, ho riscontrato il seguente errore

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 è già alla versione compatibile più recente
discourse-cakeday è già alla versione compatibile più recente
discourse-formatting-toolbar è già alla versione compatibile più recente
discourse-whos-online è già alla versione compatibile più recente
docker_manager è già alla versione compatibile più recente
vbulletin-bbcode è già alla versione compatibile più recente

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 ERRORE:  violazione della chiave univoca viola il vincolo univoco \"index_users_on_username\"
2023-04-19 00:02:30.080 UTC [634] discourse@discourse DETTAGLIO:  la chiave (username)=(xxx) esiste già.
2023-04-19 00:02:30.080 UTC [634] discourse@discourse ISTRUZIONE:  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: Si è verificato un errore, tutte le migrazioni successive sono state annullate:

PG::UniqueViolation: ERRORE:  violazione della chiave univoca viola il vincolo univoco \"index_users_on_username\"
DETAIL:  la chiave (username)=(xxx) esiste già.

Dopo aver corretto gli utenti duplicati, ne ottengo di nuovi.

discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(mhm) è duplicata.
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(ahmedhafez) è duplicata.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(hany) è duplicata.
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(eng_ali) è duplicata.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(saad_saad) è duplicata.
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(eng_ali) è duplicata.
CONTEXT:  parallel worker
discourse=# REINDEX TABLE users;
ERRORE:  impossibile creare l'indice univoco \"index_users_on_username_lower\"
DETAIL:  la chiave (username_lower)=(mostafa11) è duplicata.
CONTEXT:  parallel worker
1 Mi Piace

Sembra un indice corrotto o che in qualche modo gli utenti siano stati in grado di creare account con lo stesso nome utente con diversa capitalizzazione.

Dovresti essere in grado di avviare il vecchio container con
./launcher start app

Quindi puoi provare a reindicizzare la tabella, vedere quale utente è danneggiato, correggerlo e ripetere finché l’indice non verrà ricostruito.

1 Mi Piace

Grazie per la tua risposta.

Sì, sono in grado di avviare/accedere all’app, sto anche facendo come hai suggerito.

discourse=# REINDEX TABLE users;
ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(mostafa11) is duplicated.

Il problema è che i duplicati continuano ad arrivare, ho più di 300.000 utenti.
C’è un modo per verificare quanti duplicati ci sono o elencarli tutti?

Per la correzione, stavo aggiornando username_lower in questo modo: stavo aggiungendo un numero alla fine.

UPDATE users SET username_lower = 'xxx' WHERE id = xxx;

Devo anche aggiornare la colonna username per farla corrispondere a username_lower? C’è un modo più veloce, come correggere automaticamente questi duplicati?

Il mio sito web è ora offline, quindi qualsiasi aiuto è molto apprezzato.

1 Mi Piace

Non ne sono a conoscenza. Non dovrebbe succedere, credo. Da quale versione stai aggiornando?

Forse puoi cercare utenti dove username! = username_lower?

È andato giù anche se hai avviato l’app?

No. Va bene che un nome utente abbia lettere maiuscole e minuscole, ma non vuoi avere due nomi utente con le stesse lettere.

È il caso che tu abbia sia un Joe che un joe? Se è così, penso che dovrebbe esserci una query che potrebbe trovarli, ma non so come farlo al momento.

2 Mi Piace

Grazie Jay
Sono riuscito a ricostruire e rimettere online il mio sito web.

Innanzitutto, come hai suggerito, la soluzione è reindicizzare, correggere e ripetere finché non è fatto. Ho usato il seguente comando per vedere quanti

SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;

mi stava dando zero.

Ovviamente ci sono molti duplicati e volevo sapere quanti. quindi ho leggermente modificato la query:

SELECT username_lower, count(username) from users GROUP by username_lower HAVING count(username) > 1;

Questo ha funzionato e ha restituito circa 50 duplicati, quindi li ho corretti, reindicizzati e ricostruiti con successo.

1 Mi Piace

Fantastico! Sono felice che tu abbia risolto. I tuoi appunti dovrebbero essere molto utili ad altri con lo stesso problema.

Ho modificato il tuo post per rendere più facile per gli altri copiare/incollare il tuo SQL.

1 Mi Piace

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