Проблема миграции при дедупликации голосов за опросы

@sweetbeems вот предварительный набор команд, который должен помочь восстановить ваши данные; я уже опробовал их на своём сайте.

Я исхожу из предположения, что вы используете нашу установку через Docker и в некоторой степени знакомы с командной строкой.

Вам нужно найти файл резервной копии в <site>/admin/backups. Это должен быть файл, созданный до удаления данных.

Это руководство предполагает, что ваши резервные копии включают загрузки. Разница заключается в том, что файл резервной копии будет иметь расширение .tar.gz (данные + загрузки) вместо .sql.gz (только данные).

# войдите в приложение от имени пользователя по умолчанию
docker exec -it app bash

# проверьте наличие нужной резервной копии
ls /var/www/discourse/public/backups/default/

# извлеките файл dump.sql из сжатой резервной копии
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

# извлеките данные
# это находит начало данных голосов за опросы
# и конец данных (который представляет собой пустую строку)
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

# здесь вы должны визуально проверить poll_votes_dump.sql
cat poll_votes_dump.sql

# измените COPY на INSERT, чтобы
# мы могли добавить 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
Вот как должны выглядеть результаты команд `cat`

Первый результат должен выглядеть так

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

а второй — так

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;

Выйдите из экземпляра Docker и войдите под пользователем postgres — здесь есть более глубокая проблема, которую я не буду рассматривать здесь, но для её решения требуется выполнить дополнительные действия

# с вашего хоста получите доступ к приложению от имени пользователя postgres
docker exec --user postgres -it app bash

# выполните вставку
psql -U postgres -d discourse -f /var/www/discourse/public/backups/site-backup-to-restore/poll_votes_dump.sql

# вы должны увидеть `INSERT 0 3928` или количество восстановленных голосов за опросы
4 лайка