Ripristino del backup non riuscito

Ho il seguente problema. Gestisco un forum Discourse da oltre 10 anni e, dato che non sono riuscito a installare aggiornamenti da qualche tempo, volevo configurare un nuovo server:

Il server vecchio esegue: 3.4.0.beta4-dev

Il nuovo server: Ultima versione

Il backup ha già una dimensione di 673,2 MB come file .gz, escludendo gli allegati.

Purtroppo, il ripristino continua a interrompersi. Il file di log contiene questo errore:

[2026-06-16 07:54:52] ERROR:  could not create unique index “index_incoming_referers_on_path_and_incoming_domain_id”
[2026-06-16 07:54:52] DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.
[2026-06-16 07:54:52] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//, 5) is duplicated.

[2026-06-16 07:54:52] /var/www/discourse/lib/backup_restore/database_restorer.rb:93:in 'BackupRestore::DatabaseRestorer#restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in ‘BackupRestore::DatabaseRestorer#restore’
/var/www/discourse/lib/backup_restore/restorer.rb:61:in 'BackupRestore::Restorer#run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in ‘Object#restore’
/var/www/discourse/script/spawn_backup_restore.rb:33:in ‘block in ’
/var/www/discourse/script/spawn_backup_restore.rb:4:in 'Kernel#fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in ‘’
[2026-06-16 07:54:52] Trying to rollback...

Cosa posso fare per risolvere questo problema senza perdere gli ultimi 10 anni di dati?

Grazie in anticipo per qualsiasi aiuto!

Ciao e ben tornato dopo 9 anni!

È davvero interessante vedere un forum così longevo.

Penso che si tratti dello stesso problema di indicizzazione discusso qui: Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes)

La situazione è più o meno questa:

La tabella incoming_referers tiene traccia dei percorsi URL che hanno inviato i visitatori al tuo forum. Possiede un indice univoco, il che significa che non possono esistere due righe con la stessa combinazione percorso + dominio.

Il tuo database contiene due righe con path='//' e incoming_domain_id=5. Quando tenta di ricostruire questo indice univoco durante il ripristino, rileva la duplicazione e interrompe l’intera transazione di ripristino.

Dovrai quindi trovare e rimuovere quella duplicazione in incoming_referers e creare un nuovo backup da ripristinare sul nuovo server.

Ho trovato questo argomento con le istruzioni che potrebbero esserti utili.

Grazie mille per la risposta rapida; proverò!

(post eliminato dall’autore)

Scusa se ti disturbo, ma sembra che io stia facendo qualcosa di sbagliato: dopo aver eseguito il comando “discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;”, ricevo un errore di sintassi.

Hai digitato “discourse=#”? Se sì, riprova senza quel parametro.

Poi ricevo il messaggio di errore “bash: errore di sintassi vicino al token inaspettato `from’”

Per riferimento, mi trovo attualmente in: root@community-app:/var/www/discourse#

Ah, non sei ancora nel database.

Prima esegui psql -U discourse discourse (penso)

E poi il prompt dovrebbe cambiare in discourse=#

Ok, ora ho installato anche “apt install postgresql-client-common”. Tuttavia, ricevo ancora l’errore “Errore: è necessario installare almeno un pacchetto postgresql-client-.”

Ok, questo non lo so.

Forse prova direttamente dalla console di Rails: rails c

con

ActiveRecord::Base.connection.execute(<<~SQL)
  SELECT id, path, incoming_domain_id 
  FROM incoming_referers 
  WHERE path = '//'
  AND incoming_domain_id = 5
SQL

Questo potrebbe darti lo stesso risultato senza passare attraverso il database.

Funziona?

Mi dispiace davvero tanto per il comportamento sciocco che ho avuto.

Ho installato Rails e sembra che funzioni. L’ho eseguito anche con “rails c”. Sembra funzionare anche quello, ma quando inserisco il comando, appare così:

“root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: errore di sintassi vicino al token imprevisto `<<’
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: comando non trovato
root@community:/var/discourse# FROM incoming_referers
FROM: comando non trovato
root@community:/var/discourse# WHERE path = ‘//’
WHERE: comando non trovato
root@community:/var/discourse# AND incoming_domain_id = 5
AND: comando non trovato
root@community:/var/discourse# SQL”

Non preoccuparti, forse le mie istruzioni non sono poi così chiare :slight_smile:

Ti confesso che sono un po’ perplesso: dici di aver appena installato Rails ma di non riuscire ad accedere al database. Forse la situazione è diversa perché si tratta di una versione più vecchia, ma onestamente penso di aver raggiunto i miei limiti.

Comunque, una volta dentro Rails, il prompt dovrebbe essere diverso. Dal tuo output, sembra che tu non sia ancora nella console di Rails.

A dire il vero, non credo nemmeno che tu sia dentro il container. Hai provato a eseguire ./launcher enter app?

OK, sì, era quello il problema. La query è stata eseguita con successo e ho ottenuto questa risposta:

#<PG::Result:0x00007fbde9732ef0 status=PGRES_TUPLES_OK ntuples=1 nfields=3 cmd_tuples=1>

Quindi, ntuples=1 significa che è stata trovata solo una riga, mentre secondo il registro degli errori dovrebbe esserci un duplicato… :woman_shrugging:

Mi dispiace, non so cosa provare oltre. Ti consiglio di navigare nel forum: sembrano esserci molti casi simili (vedi sotto questo argomento nella sezione correlata), forse lì troverai il prossimo indizio.

(oppure aspetta che passi qualcuno più esperto ;))

Sembra che il tuo vecchio server non sia un’installazione standard. Comunque,… ecco cosa è successo in breve: un indice sul tuo vecchio server si è corrotto nel corso degli anni (questo può accadere dopo aggiornamenti del sistema operativo), quindi due righe identiche sono finite nella tabella incoming_referers. Il backup le copia così come sono, e il nuovo server le rifiuta. Quindi prima risolviamo il problema sul server vecchio, poi creiamo un nuovo backup.

Sul server VECCHIO, apri la console di Rails:

./launcher enter app
rails c

Poi incolla queste righe, una dopo l’altra:

db = ActiveRecord::Base.connection.current_database
DB.exec("DELETE FROM incoming_referers a USING incoming_referers b WHERE a.id > b.id AND a.path = b.path AND a.incoming_domain_id = b.incoming_domain_id")
DB.exec("REINDEX DATABASE #{ActiveRecord::Base.connection.quote_table_name(db)}")

Questo rimuove i duplicati e ricostruisce tutti gli indici (nel caso in cui anche altre tabelle siano interessate).

Se REINDEX termina senza errori, digita exit, crea un nuovo backup sul vecchio server e ripristina quel nuovo file. Se mostra un errore relativo a un’altra tabella, incollalo qui.

Grazie mille. Purtroppo, ricevo un messaggio di errore sull’ultima riga:

«PG::InsufficientPrivilege: ERRORE: deve essere il proprietario del database discourse»

Dovrebbe essere già un «server standard». L’installazione è stata effettuata in quel momento dal team di «Discourse» per una tariffa una tantum.

Ah, giusto. Proviamo così.

Esci dalla console di Rails (digita exit) e, restando sempre all’interno del container (./launcher enter app), esegui:

su postgres -c "reindexdb discourse"

Una volta completata l’operazione senza errori, crea un nuovo backup sul vecchio server e ripristina questo nuovo file. Se dovesse comparire un errore relativo a una tabella specifica, incollalo pure qui.

Grazie infinite! Tutto è andato alla perfezione e, senza il tuo aiuto, non avrei avuto nessuna possibilità e avrei dovuto ricominciare il forum da capo, con grande fatica, molto presto! GRAZIE!

Grazie anche a @chapoi per il grande supporto!