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.
./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.
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 Mantengo backup giornalieri e poi anche “istantanee” mensili. Il backup più vecchio che avevo che non aveva un database corrotto aveva 4 mesi