@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
# ON CONFLICT을 추가할 수 있도록
# COPY를 INSERT로 변경합니다
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;
도커 인스턴스에서 빠져나와 postgres 사용자로 진입합니다 – 여기서 다루지 않을 더 깊은 문제가 있어 이 추가 단계가 필요합니다
# 호스트에서 postgres 사용자로 앱 접근
docker exec --user postgres -it app bash
# 삽입(insert)
psql -U postgres -d discourse -f /var/www/discourse/public/backups/site-backup-to-restore/poll_votes_dump.sql
# `INSERT 0 3928` 또는 복원된 투표 수를 확인해야 합니다