Ripristino fallito: impossibile creare indice univoco

Ciao,

Sto cercando di ripristinare un backup su una nuova istanza di Discourse mentre eseguo una migrazione del server. Purtroppo ricevo questo errore:

Ho letto questo:

Restore fails - could not create unique index - #2 by simon e ho eliminato gli indici.

Ora, quando eseguo:

[2] pry(main)> IncomingReferer.where(path: "/m/search")
=> []

non ottengo alcun risultato.

È tutto a posto ora per eseguire un backup e ripristinarlo sull’altro server?

Grazie,

Sam

Sfortunatamente questo non ha aiutato, e ricevo ancora questo messaggio durante il ripristino:

[2021-07-03 16:53:41] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 16:53:41] DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.
[2021-07-03 16:53:41] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.

Non è chiaro per me come risolvere questo problema.

Ho trovato altri duplicati con IncomingReferer.where("path LIKE '%/m/search%'"), quindi ho usato il metodo destroy anche su questi indici. La mia istanza ora sembra non funzionare affatto — nemmeno sul vecchio server, quindi proverò a ricostruirla.

Sam

C’è ancora qualcosa che non va. Ricevo il seguente messaggio:

[2021-07-03 17:28:53] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 17:28:53] DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.
[2021-07-03 17:28:53] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.

mentre provo a ripristinare un nuovo backup.
Tuttavia, dalla mia console vedo che ho già pulito le istanze sul server in esecuzione (che ora è di nuovo operativo dopo la ricostruzione):

[1] pry(main)> IncomingReferer.where(path: "/m/search")
=> []
[2] pry(main)> IncomingReferer.where("path LIKE '%/m/search%'")
=> []

Qualcuno può consigliarmi cosa fare per correggere il database, così da poterlo ripristinare su un’altra macchina?

Grazie,

Sam

Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes) potrebbe offrire alcuni indizi.

Grazie.

L’ho già letto, ma non so quali comandi o query eseguire per risolvere il mio problema.

Sam

In sostanza, devi provare a ricostruire l’indice e continuare a eliminare elementi finché non riesci a indicizzarlo di nuovo. Sembra che tu stia facendo la cosa giusta; devi solo continuare a farlo per tutte le voci duplicate.

Se hai un budget, puoi pubblicare in Marketplace.

Ciao Jay,

Non è legale nel Regno Unito esporre il nostro database a terze parti per risolvere questi problemi, e anche se lo fosse, non ho alcun interesse a farlo, per tutelare la privacy degli utenti.

Essendo anch’io un manutentore di software open source, trovo deludente la proposta di portare la questione su Marketplace, soprattutto quando sembra esserci un tacito riconoscimento che i problemi siano stati introdotti da un aggiornamento di Postgres incluso nel container Docker di Discourse. Utilizziamo Discourse nel container Docker perché comprendiamo le dipendenze strettamente accoppiate e vogliamo delegare la gestione delle versioni e delle dipendenze all’esperienza del team di Discourse.

Sembra ormai accettato che si tratti di una regressione di Postgres 12 e che esistano alcune possibili mitigazioni. Tuttavia, le prime segnalazioni sono arrivate oltre un anno fa, e sono certo che ci saranno altri utenti interessati in futuro se proveranno a ripristinare un backup.

Preferirei finanziare del tempo di sviluppo per risolvere il problema a monte in Discourse, in modo che anche altri possano trarne beneficio. Nel frattempo, il nostro forum non è funzionante e dovrò chiedere aiuto a qualcuno con competenze di DBA su Postgres.

Cordiali saluti,

Sam

1 Mi Piace

Ciao Sam.

Scusa se non sono riuscito a darti istruzioni sufficienti per risolvere il problema da solo, ma è così che hai fatto sembrare le cose. Pensavo che potesse essere un sollievo, piuttosto che una delusione, il fatto che ci siano altri modi per rimettere online il tuo forum.

Un saluto

1 Mi Piace

Ciao Jay

Per nulla. Non mi devi nulla, ma speravo che avessi una soluzione rapida, dato il tuo storico di post, e avevo assunto che avessi perso qualcosa di ovvio, visto che i tuoi post sembravano una risposta definitiva e l’argomento era chiuso.

Ti farò sapere come va.

Saluti,

Sam

1 Mi Piace

Purtroppo questo rimane un problema per noi e non possiamo migrare i server, il che è piuttosto preoccupante.

Saremmo felici di pagare qualcuno per risolvere la questione, ma dopo questo problema e il suo riconoscimento ripetuto nel forum senza una soluzione chiara, stiamo seriamente valutando di passare a un altro software per forum come Flarum. Potrebbe non essere ricco di funzionalità come Discourse, ma è basato su LAMP e io (come non sviluppatore web) posso capirne il funzionamento.

Quando abbiamo utilizzato il contenitore Docker di Discourse, aspettavamo un supporto. Se avessimo distribuito tutto separatamente e utilizzato la nostra versione di Postgres, potrei comprendere la risposta. Ma finora, abbiamo solo utilizzato l’ambiente che voi stessi avete raccomandato e fornito, e ora siamo in una situazione difficile in termini di migrazione a un nuovo server (abbiamo una scadenza imminente).

A questo punto, la mia migliore opzione è un backup e ripristino tramite volume Docker, poiché i backup di Discourse non sono utilizzabili. Anche questo è preoccupante: abbiamo backup giornalieri, ma non è possibile ripristinarli in un nuovo ambiente Discourse. Mi chiedo quanti altri incontreranno un problema simile nel prossimo futuro.

Sam

C’erano parecchi bug in Postgres che potevano causare l’ corrupción degli indici. Pensiamo che la maggior parte di essi siano stati risolti in Postgres 13.x.