Problema di migrazione relativo alla deduplicazione dei voti del sondaggio

@sweetbeems ecco un set preliminare di comandi che dovrebbero aiutarti a ripristinare i tuoi dati e che ho testato sul mio sito.

Presumo che tu stia utilizzando la nostra installazione docker e che tu abbia una certa familiarità con la riga di comando.

Dovresti identificare un file di backup da <sito>/admin/backups. Dovrebbe essere uno fatto prima che i dati venissero eliminati.

Questa guida presuppone che i tuoi backup includano gli upload. La differenza è che il file di backup sarebbe .tar.gz (dati+upload) rispetto a .sql.gz (solo dati).

# entra nell'app usando l'utente predefinito
docker exec -it app bash

# identifica il backup che desideri sia presente
ls /var/www/discourse/public/backups/default/

# estrai il file dump.sql dal backup compresso
cd /var/www/discourse/public/backups
mkdir site-backup-to-restore
tar xfz ./default/=SITE_BACKUP_FILENAME= -C site-backup-to-restore/
cd site-backup-to-restore
gunzip dump.sql.gz

# ottieni i dati
# questo trova l'inizio dei dati dei voti dei sondaggi
# fino alla fine dei dati (che sarebbe una riga vuota)
start=$(grep -n "COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;" dump.sql | sed  's/\([0-9]*\).*/\1/')
end=$(tail -n +$start dump.sql | grep -m 1 -n ^$ | sed  's/\([0-9]*\).*/\1/')
end=$((end-2))
tail -n +$start dump.sql | head -n $end > poll_votes_dump.sql

# qui dovresti dare un'occhiata a poll_votes_dump.sql
cat poll_votes_dump.sql

# cambia la COPY in un INSERT in modo che
# possiamo ancora aggiungere ON CONFLICT
sed -i 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\.[0-9]\{6\}/'\''&\''/g' poll_votes_dump.sql
sed -i '2,$s/\t/,/g' poll_votes_dump.sql
sed -i '2,$s/^/(/; 2,$s/$/),/' poll_votes_dump.sql
sed -i '$ s/,$//' poll_votes_dump.sql
sed -i 's/COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;/INSERT INTO public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at)\nVALUES/' poll_votes_dump.sql
echo "ON CONFLICT DO NOTHING;" >> poll_votes_dump.sql
cat poll_votes_dump.sql
Questi sono i risultati dei comandi `cat`

Il primo dovrebbe apparire così

COPY public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at) FROM stdin;
1       1       1       2023-07-04 05:49:17.031031      2023-07-04 05:49:17.031031
1       4       1       2023-07-04 05:54:01.281801      2023-07-04 05:54:01.281801

e il secondo dovrebbe apparire così

INSERT INTO public.poll_votes (poll_id, poll_option_id, user_id, created_at, updated_at)
VALUES
(1,1,1,'2023-07-04 05:49:17.031031','2023-07-04 05:49:17.031031'),
(1,4,1,'2023-07-04 05:54:01.281801','2023-07-04 05:54:01.281801')
ON CONFLICT DO NOTHING;

Esci dall’istanza docker ed entra nell’utente postgres – C’è un problema più profondo che non affronterò qui che richiede questo ulteriore passaggio

# dal tuo host, accedi all'app tramite l'utente postgres
docker exec --user postgres -it app bash

# inserisci
psql -U postgres -d discourse -f /var/www/discourse/public/backups/site-backup-to-restore/poll_votes_dump.sql

# dovresti vedere `INSERT 0 3928` o il numero di voti dei sondaggi che sono stati ripristinati
4 Mi Piace