@sweetbeems إليك مجموعة أولية من الأوامر التي يجب أن تساعد في استعادة بياناتك، وقد اختبرتها على موقعي.
أفترض أنك تستخدم تثبيت docker الخاص بنا وأنك على دراية بسطر الأوامر.
يجب عليك تحديد ملف نسخ احتياطي من \u003csite\u003e/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` أو عدد أصوات الاستطلاع التي تم استعادتها