@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