Problema de migração em torno da desduplicação de votos de enquetes

@sweetbeems aqui está um conjunto preliminar de comandos que devem ajudar a restaurar seus dados, e eu testei em meu site.

Estou assumindo que você está usando nossa instalação docker e está um tanto familiarizado com a linha de comando.

Você deve identificar um arquivo de backup em <site>/admin/backups. Deve ser um que foi feito antes que os dados fossem excluídos.

Este guia assume que seus backups incluem uploads. A diferença é que o arquivo de backup seria .tar.gz (dados+uploads) versus .sql.gz (apenas dados).

# entre no app usando o usuário padrão
docker exec -it app bash

# identifique o backup que você quer que esteja lá
ls /var/www/discourse/public/backups/default/

# extraia o arquivo dump.sql do backup compactado
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

# obtenha os dados
# isso encontra o início dos dados de votos de enquete
# até o final dos dados (que seria uma linha vazia)
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

# aqui você gostaria de inspecionar poll_votes_dump.sql
cat poll_votes_dump.sql

# mude o COPY para um INSERT para que
# ainda possamos adicionar 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
Estes são os resultados esperados dos comandos `cat`

O primeiro deve parecer com isto

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 o segundo deve parecer com isto

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;

Saia da instância docker e entre como o usuário postgres – Há um problema mais profundo que não abordarei aqui, que requer este passo adicional.

# do seu host, acesse o app via o usuário postgres
docker exec --user postgres -it app bash

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

# você deve ver `INSERT 0 3928` ou o número de votos de enquete que foram restaurados
4 curtidas