فشل الاستعادة: تعذر إنشاء فهرس فريد

مرحباً،

أحاول استعادة نسخة احتياطية على مثيل Discourse جديد لأنني أقوم بهجرة الخادم. للأسف، أواجه هذه الرسالة الخطأ:

قرأت هذا الموضوع:

Restore fails - could not create unique index - #2 by simon وقمت بحذف الفهارس.

الآن، عندما أقوم بتنفيذ الأمر التالي:

[2] pry(main)> IncomingReferer.where(path: "/m/search")
=> []

لا أحصل على أي نتيجة.

هل هذا يعني أن الأمر أصبح آمناً الآن لأخذ نسخة احتياطية واستعادتها على الخادم الآخر؟

شكراً لك،
سام

للأسف، لم يساعد ذلك، وما زلت أحصل على هذه الرسالة عند الاستعادة:

[2021-07-03 16:53:41] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 16:53:41] DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.
[2021-07-03 16:53:41] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/search, 4502) is duplicated.

ليس واضحًا بالنسبة لي كيفية إصلاح ذلك.

لقد وجدت المزيد من التكرارات باستخدام ```IncomingReferer.where(“path LIKE ‘%/m/search%’”)``، لذا استخدمت الحذف لهذه الفهارس أيضًا. يبدو الآن أن مثيلي لا يعمل على الإطلاق — حتى على الخادم القديم، لذا سأحاول إعادة بنائه.

سام

لا يزال هناك خطأ. أحصل على:

[2021-07-03 17:28:53] ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
[2021-07-03 17:28:53] DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.
[2021-07-03 17:28:53] EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/osmc/osmc, 2939) is duplicated.

عند محاولة استعادة نسخة احتياطية جديدة.
لكن سطر الأوامر الخاص بي يُظهر أنني قمت بتنظيف المثيلات على الخادم قيد التشغيل (والذي عاد للعمل الآن بعد إعادة البناء):

[1] pry(main)> IncomingReferer.where(path: "/m/search")
=> []
[2] pry(main)> IncomingReferer.where("path LIKE '%/m/search%'")
=> []

هل يمكن لأي شخص أن ينصح بما يجب فعله لإصلاح قاعدة البيانات حتى أتمكن من استعادتها على جهاز آخر؟

شكرًا

سام

قد يقدم بعض التلميحات: Can't restore due to corrupt indexes (with some clues on how to deal with corrupt indexes)

شكرًا لك.

لقد قرأت هذا، لكنني لا أعرف الأوامر أو الاستعلامات التي يجب تشغيلها لحل مشكلتي.

سام

بشكل أساسي، تريد إعادة بناء الفهرس مع الاستمرار في حذف العناصر حتى تتمكن من إعادة فهرستها. يبدو أنك تقوم بالإجراءات الصحيحة، ولكنك تحتاج إلى الاستمرار في ذلك لجميع الإدخالات المكررة.

إذا كان لديك ميزانية، فيمكنك النشر في Marketplace.

مرحبًا جاي

ليس قانونيًا في المملكة المتحدة تعريض قاعدة بياناتنا لأطراف ثالثة لحل هذه المشكلات، وحتى لو كان ذلك قانونيًا، فلا يوجد لدي أي اهتمام بفعل ذلك حفاظًا على خصوصية المستخدمين.

بصفتي مسؤولًا عن مشروع مفتوح المصدر، فإن فكرة نقل الأمر إلى Marketplace مخيبة للآمال، خاصةً عندما يبدو أن هناك اعترافًا ضمنيًا بأن المشكلات ناتجة عن تحديث لـ Postgres تم تضمينه في حاوية Docker الخاصة بـ Discourse. نستخدم Discourse في حاوية Docker لأننا ندرك الاعتماديات المترابطة عن كثب ونود تفويض إدارة الإصدارات والاعتماديات لخبرة فريق Discourse.

يبدو أن الأمر مقبول بأن هذه مشكلة تراجع في Postgres 12 وأن هناك بعض التخفيفات المحتملة. ومع ذلك، بدأت التقارير الأولى قبل أكثر من عام، وأنا متأكد من أن هناك مستخدمين أكثر سيتأثرون في المستقبل إذا حاولوا استعادة نسخة احتياطية.

أفضل رعاية وقت تطوير لإصلاح هذا الأمر في Discourse من المصدر (upstream) حتى يستفيد منه الآخرون أيضًا. وفي الوقت الراهن، منتدى غير وظيفي، وسيكون عليّ استشارة شخص يمتلك معرفة بمسؤولي قواعد بيانات Postgres.

تحياتي

سام

مرحبًا سام.

أعتذر لأنني لم أتمكن من تزويدك بتعليمات كافية لحل مشكلتك بنفسك، لكن هذا هو ما بدا أنك تقصده. ظننت أن وجود طرق أخرى لإعادة منتدى الإنترنت إلى العمل قد يكون مصدر راحة بدلاً من خيبة أمل.

تحياتي

مرحبًا جاى

على الإطلاق. أنت لا مدين لي بشيء — لكنني كنت آمل أن يكون لديك حل سريع نظرًا لسجل مشاركاتك، وقد افترضت أنني أغفلت شيئًا واضحًا نظرًا لأن مشاركاتك بدت إجابة حاسمة والموضوع مغلق.

سأخبرك بكيفية تقدمي.

تحياتي

سام

للأسف، لا يزال هذا يمثل مشكلة بالنسبة لنا، ولا يمكننا نقل الخوادم، وهو أمر مثير للقلق إلى حد ما.

نحن مستعدون لدفع مبلغ لشخص ما لحل هذه المشكلة، ولكن بعد هذه الحادثة، واعتراف الفريق بها مرات عديدة دون وجود حل واضح في المنتدى، فإننا نعتبر بجدية الانتقال إلى برنامج منتدى مختلف مثل Flarum. قد لا يكون غنيًا بالميزات مثل Discourse، لكنه يعتمد على مكدس LAMP، ويمكنني (بصفتي غير مطور ويب) فهمه والعمل عليه.

عندما استخدمنا حاوية Docker الخاصة بـ Discourse، توقعنا أن يكون هناك دعم فني. لو كنا قد نشرنا كل شيء بشكل منفصل واستخدمنا إصدارنا الخاص من Postgres، لكان من الممكن أن نقدر الرد. ولكن حتى الآن، كل ما قمنا به هو استخدام البيئة التي أوصى بها الفريق وقدموها بأنفسهم، والآن نحن في ورطة كبيرة فيما يتعلق بنقلنا إلى خادم جديد (لدينا موعد نهائي وشيك).

في هذه المرحلة، أفضل خيار لدي هو إجراء نسخ احتياطي لاستعادة مجلد Docker، لأن نسخ Discourse الاحتياطية غير قابلة للاستخدام. هذا أيضًا أمر مقلق: لدينا نسخ احتياطية يتم إنشاؤها يوميًا، لكن لا يمكن استعادتها فعليًا إلى بيئة Discourse جديدة. أتساءل كم عدد الآخرين الذين سيواجهون مثل هذه المشكلة في المستقبل القريب.

سام

كانت هناك بالفعل أخطاء قليلة في Postgres تسببت في تلف الفهارس. نعتقد أن معظمها قد تم إصلاحه في Postgres 13.x.