ECCEZIONE: psql fallito: DETTAGLIO: Key (post_id)=(36946) è duplicata.

Sto cercando di migrare il mio server a un nuovo host, quindi ho scaricato un file di backup e l’ho caricato sul nuovo host. Ho installato una copia fresca di Discourse e ho seguito le istruzioni per farlo dalla riga di comando:

Sfortunatamente, il comando discourse restore databasename fallisce con:

ALTER TABLE
ALTER TABLE
ALTER TABLE
ERROR:  could not create unique index "posts_search_pkey"
DETAIL:  Key (post_id)=(36946) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (post_id)=(36946) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'

Sembra che ci sia qualcosa che non va nel file del database? Qualcuno può darmi indicazioni su come posso risolvere questo errore? Ho ancora accesso al server originale, che sembra funzionare correttamente.

C’è qualche comando SQL o qualcos’altro che posso eseguire per analizzare (e correggere?) il database prima di scaricare un backup?

Sembra che tu abbia un indice corrotto. Di che versione di postgres si tratta?

Ci sono alcuni argomenti a riguardo. Puoi provare a reindicizzare quella tabella sull’istanza in esecuzione e quindi eliminare o correggere gli ID duplicati.

Sì, penso che sia corrotto. Mi piacerebbe se qualcuno potesse dirmi come risolverlo :slight_smile:

Postgres è 13.6. Sto cercando di spostarlo su una nuova istanza su un server diverso.

Ho provato rake search:reindex all’interno del container Docker e fallisce con:

........rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "posts_search_pkey"
DETAIL:  Key (post_id)=(86919) already exists.

È possibile semplicemente eliminare il record in questione e reindicizzare o qualcosa del genere?

Qualsiasi aiuto è apprezzato!

Sì, consiglio di eliminare semplicemente la riga, è il modo più semplice per procedere

2 Mi Piace

Qualcuno può darmi alcuni comandi psql che posso usare per identificare e rimuovere le righe problematiche?

Grazie, è apprezzato!

Penso che sia qualcosa del tipo

./launcher enter app
su - postges
psql discourse
select id from post_search_data where post_id>86918 and post_id<86921;
--- quando ottieni l'id ----
delete from post_search_data where id=ID_DALL_ULTIMA_QUERY

Potrebbe esserci di più.

Forse qualcun altro può fornire ulteriore aiuto, ma questo è tutto ciò che penso di poter fare senza essere connesso al tuo server. Se hai bisogno di molto più aiuto, puoi pubblicare su Marketplace o contattarmi direttamente.

O forse è sicuro semplicemente cancellarlo e farlo rigenerare, ma non ne sono del tutto sicuro.

Grazie per l’aiuto, ragazzi.

Sono riuscito a fare quanto segue:

discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew2"
DETAIL:  Key (post_id)=(116038) is duplicated.
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 2
discourse=# delete from post_search_data
where post_id = 116038;
DELETE 0
discourse=# reindex index concurrently "posts_search_pkey";
ERROR:  could not create unique index "posts_search_pkey_ccnew3"
DETAIL:  Key (post_id)=(9336) is duplicated.
discourse=# delete from post_search_data
where post_id = 9336;
DELETE 1
.
.
.
.
discourse=# reindex index concurrently "posts_search_pkey";
REINDEX

Una volta che tutto sembrava a posto, ho eseguito un backup completo e l’ho ripristinato su un nuovo server senza problemi.

Apprezzo il tempo di tutti. Amo discourse!

Lezione imparata: controlla i backup di tanto in tanto per assicurarti che siano buoni :slight_smile: Mantengo backup giornalieri e poi anche “istantanee” mensili. Il backup più vecchio che avevo che non aveva un database corrotto aveva 4 mesi :frowning:

5 Mi Piace

Fantastico! Sono così felice che tu ci sia riuscito!

@sam Ciò che è preoccupante è che pensavo che la spiegazione fosse che si trattava di un problema con PG<13, ma tu stai eseguendo PG13.

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