Ho fatto questo e Postgres (e Discourse!) sembrano essere felici.
Li ho puliti manualmente, rendendo gli URL univoci con pattern ** appropriati. Potrebbe essere solo una cache innocua dove avrei potuto eliminare i duplicati, ma non volevo rischiare.
Nel mio caso, era solo un indice, quindi ricostruire tutti gli indici è stato probabilmente eccessivo, ma onestamente mi sono sentito meglio sapendo di aver catturato tutto.
Dopo alcuni tentativi falliti di ricostruzione, che richiedono circa 30 secondi ogni volta e segnalano un singolo problema, questa è stata la mia magia SQL per ottenere un elenco completo degli elementi problematici all’istante:
discourse=# select topic_id, post_id, url, COUNT(*) from topic_links GROUP BY topic_id, post_id, url HAVING COUNT(*) > 1 order by topic_id, post_id;
topic_id | post_id | url | count
----------+---------+-------------------------------------------------------+-------
19200 | 88461 | http://hg.libsdl.org/SDL/rev/**533131e24aeb | 2
19207 | 88521 | http://hg.libsdl.org/SDL/rev/44a2e00e7c66 | 2
19255 | 88683 | http://lists.libsdl.org/__listinfo.cgi/sdl-libsdl.org | 2
19255 | 88683 | http://lists.libsdl.org/**listinfo.cgi/sdl-libsdl.org | 2
19523 | 90003 | http://twitter.com/Ironcode_Gaming | 2
(5 rows)
(5 elementi problematici rimanenti in questa query, a scopo illustrativo.)
Poi guardavo ogni post per vedere cosa c’era e cosa sistemare:
select * from topic_links where topic_id=19255 and post_id=88683
e poi sistemavo uno di essi:
update public.topic_links set url='http://lists.libsdl.org/__listinfo.cgi/**sdl-libsdl.org' where id=275100;
Fino a quando non ho finito le cose da sistemare. ![]()
Probabilmente avrei potuto usare qualche magia di inner-join (o forse un po’ di Ruby) per ottenere tutto in una query, ma non sono un esperto e alla fine non è stato un lavoro di ore farlo manualmente. Ma è stato noioso, sia chiaro. ![]()
Poi ho eseguito REINDEX DATABASE discourse; senza CONCURRENTLY solo per mantenerlo semplice, ho eliminato alcuni indici ccnew* che avevo trascurato in precedenza, e tutto era a posto.
Il sito è rimasto attivo per tutto il tempo, senza interruzioni.
Che fosse necessario o meno, sicuramente sento che i miei dati sono un po’ più sicuri ora, e non sto correndo verso qualche disastro non annunciato.
Grazie per avermi spinto nella giusta direzione per risolvere questo problema, @pfaffman!