Problemi di aggiornamento: Aggiornamento fallito a causa di chiave duplicata, Ripristino snapshot fallito

Sembra di aver riscontrato un problema durante l’esecuzione dell’ultimo aggiornamento, che fallisce a causa di quanto segue:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(scottie) already exists.

Ho provato a recuperare tentando di eliminare questo utente accedendo sia alla console di Rails che direttamente al database Postgres, ma continuo a ricevere un errore che indica che il server non è in esecuzione.

Di seguito riporto il tentativo di eseguire rails dopo l’avvio dell’app:

FAILED

--------------------

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 3743 exit 1>

Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

c744729efb7a5813699e2fe8fa46ab551352d45ada8dcb9204121508364f8438

** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

./discourse-doctor may help diagnose the problem.

root@kForum:/var/discourse# ./launcher start app

starting up existing container

+ /usr/bin/docker start app

app

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# rails c

bundler: failed to load command: pry (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/pry)

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Di seguito riporto il tentativo di eseguire postgres:

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# su discourse

discourse@kForum-app:/var/www/discourse$ psql discourse

psql: error: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

discourse@kForum-app:/var/www/discourse$

Sto ripristinando uno snapshot precedente su DigitalOcean per tornare a uno stato funzionante, ma la parte strana (spaventosa?) è che persino il ripristino dello snapshot non sembra aver riportato il sito in funzione. Questo snapshot è stato creato oltre 24 ore fa, quando so che i forum funzionavano correttamente, quindi non dovrebbe essere correlato all’aggiornamento che ho tentato.

Nel mio snapshot ripristinato, questo è l’errore che vedo quando provo a fermare/avviare/riavviare l’app:

root@kForum:/var/discourse# ./launcher restart app

+ /usr/bin/docker stop -t 10 app

app

starting up existing container

+ /usr/bin/docker start app

Error response from daemon: container "a1023d05a7b4de25ded1aa69ad49caed9fa59d15fa8e8130d32db82934139e6b": already exists

Error: failed to start containers: app

root@kForum:/var/discourse#

Infine, ho eseguito discourse-doctor e questa sembra essere una parte rilevante del fallimento?

Checking cluster versions                                   ok

The source cluster was not shut down cleanly.
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.

You can run ./launcher start app to restart your app in the meanwhile



FAILED
--------------------
Pups::ExecError: /root/upgrade_postgres failed with return #<Process::Status: pid 46 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params "/root/upgrade_postgres"
c98d1b076faed9b0c728cd944b3f2436afc9e266910b82a644c71fd80b42f073
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
==================== END REBUILD LOG ====================
Failed to rebuild app.

Checking your domain name . . .

Connection to forum.kirupa.com succeeded.
You should probably remove any non-standard plugins and rebuild.
Attempting to restart existing container. . . 

starting up existing container
+ /usr/bin/docker start app
Error response from daemon: driver failed programming external connectivity on endpoint app (78a35e0f12e5af560bd1f991ead900fefd0c81570cc4582fe99aaa5e56b238e8): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
Error: failed to start containers: app
Failed to restart the container.


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-sitemap.git

No non-official plugins detected.

See https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb for the official list.

========================================
Discourse version at forum.kirupa.com: NOT FOUND
Discourse version at localhost: NOT FOUND

Cosa pensi che stia succedendo qui? Il mio obiettivo principale è riportare i forum online. La correzione dei fallimenti dell’aggiornamento è un obiettivo secondario.

Grazie,
Kirupa

Dovresti guardare qui - sembra essere lo stesso problema: Help! Upgrade led to complete fail

Ieri ho avuto un caso che ritengo simile (vedi Help! Upgrade led to complete fail - #8 by Judith). In linea di massima, credo che tu debba fare qualcosa del genere:

  • rinominare postgres_data _old in postgres_data
  • riavviare il vecchio container
  • risolvere il problema dell’indice corrotto rinominando gli utenti duplicati (o forse quelli duplicati a causa di differenze nelle maiuscole/minuscole)
  • ricostruire gli indici sulla tabella users per assicurarti che siano tutti corretti
  • passare al template di PostgreSQL 12 come descritto in Aggiornamento PostgreSQL 13
  • ricostruire per eseguire l’aggiornamento
  • quando funziona, puoi tornare al template precedente e completare l’aggiornamento.
  • nota che devi aggiornare non solo il nome utente, ma anche username_lower

Quello che ho risolto ieri aveva un nome utente duplicato risalente a febbraio 2020, quindi probabilmente non vorrai tentare di risolvere il problema ripristinando un database più vecchio.

Per risolverlo, devi sapere come modificare i record tramite la riga di comando di PostgreSQL, ricostruire i database e gestire problemi complessi, ma ben documentati, nell’aggiornamento a PostgreSQL 13.

Se hai un budget di 500 $, puoi contattarmi. Le mie informazioni di contatto sono nel mio profilo.

@pfaffman - ti ho appena inviato un messaggio tramite il tuo modulo di contatto :slight_smile:

Ho risposto. Se non l’hai ricevuto, forse hai inserito l’indirizzo sbagliato?

1 Mi Piace

Per chiudere il cerchio su questo, @pfaffman è un mago. Ha risolto il problema con l’aggiornamento del forum (e una serie di problemi correlati) molto velocemente :slight_smile:

3 Mi Piace

Ho lo stesso problema, ma non pagherò $500 per una soluzione. Ho accesso SFTP al server, quindi non sarebbe possibile aprire il database in un editor di testo e rinominare il nome utente in conflitto?

Oppure, se qualcuno può risolverlo per circa $50, per favore contattatemi.

Puoi dare un’occhiata a PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep dove qualcuno ha descritto abbastanza bene cosa ha fatto.

Avrai bisogno di un client SSH, non SFTP. Se stai usando Digital Ocean puoi usare la console sul loro sito web.