投票去重迁移问题

@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

# 获取数据
# 这会找到 poll votes 数据行的开头
# 到数据结尾(会有一个空行)
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 个赞