Ripristino dal backup fallito: errore nella creazione dell'indice postgres

Ciao a tutti,

Ho gestito Discourse senza problemi per diversi anni.

Oggi ho provato a eseguire un aggiornamento tramite l’interfaccia web dalla versione 2.4.0beta-something che stavo utilizzando alla versione corrente (2.5.0beta5). Questo… non è andato bene. Non ho preso appunti dettagliati, ma sembrava che PostgreSQL non si avviasse correttamente a causa della directory dei dati di PostgreSQL non posseduta dall’utente corretto.

Ho pensato di provare a clonare i miei vecchi container/app.yml in app2 e ripristinare da un backup. Il nuovo container è stato compilato e ho seguito le istruzioni per eseguire un backup da riga di comando (Restore a backup from the command line - #12). Il comando “discourse restore ” fallisce con:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(//viewer/, 16) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Trying to rollback...
Rolling back...
Cleaning stuff up...

Qualsiasi suggerimento su come procedere sarebbe molto apprezzato.

Grazie!
–dustin

Benvenuto, Dustin. Ci dispiace per i problemi che stai riscontrando.

Hai un indice corrotto. Dai un’occhiata a PostgreSQL 12 update - #238.

1 Mi Piace

Grazie per la risposta. Alla fine, invece di cercare di creare una nuova app e ripristinare dal backup, sono tornato alla mia app originale ed ho eseguito ‘./launcher rebuild app’ un paio di volte (come root, cosa che non avrei pensato necessaria, ma credo di aver configurato il mio sito come root inizialmente, quindi ha senso). Ora il mio sito è di nuovo operativo! Evviva!

Ricordati di non toccare mai distrattamente il pulsante Upgrade, che sembra così amichevole!

grazie,
–dustin

2 Mi Piace

Hai ancora l’indice corrotto. Vuoi che non sia corrotto.

1 Mi Piace

Wow, sarebbe davvero bello se il processo di aggiornamento potesse risolvere alcuni di questi problemi!

Quindi, dopo aver installato il plugin Data Explorer e dato un’occhiata all’indice incoming_referers, oltre a eliminare altri indici elencati nella query qui:

Sto ancora ottenendo:

discourse=# REINDEX SCHEMA CONCURRENTLY public;
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew" concurrently, skipping
WARNING:  cannot reindex invalid index "pg_toast.pg_toast_19337_index_ccnew1" concurrently, skipping

E quelli non vogliono essere eliminati!

# drop index pg_toast_19337_index_ccnew1;
ERROR:  index "pg_toast_19337_index_ccnew1" does not exist
1 Mi Piace

Ah, serve il prefisso pg_toast:

discourse=# drop index pg_toast.pg_toast_19337_index_ccnew1;
DROP INDEX
discourse=# drop index pg_toast.pg_toast_19337_index_ccnew;
DROP INDEX
discourse=# REINDEX SCHEMA CONCURRENTLY public;
REINDEX

Sì, stiamo esaminando attentamente gli indici corrotti; ci scusiamo per le difficoltà. In teoria, ciò non dovrebbe essere possibile… ma sai cosa si dice sulla teoria rispetto alla pratica. Spero che PG12 sia più resistente a… a whatever questo sia.

1 Mi Piace

È bello sentirlo. Questo è sostanzialmente il primo ostacolo che incontro dopo anni di utilizzo

1 Mi Piace