مرحبًا، فشل استعادة النسخة الاحتياطية مع الخطأ التالي:
CREATE INDEX
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL: Key (path, incoming_domain_id)=(/m/search, 25) is duplicated.
EXCEPTION: psql failed: DETAIL: Key (path, incoming_domain_id)=(/m/search, 25) is duplicated.
ظهرت هذه المشكلة المتعلقة بجدول incoming_referers عدة مرات مؤخرًا. لست متأكدًا من سبب تسبب هذا الجدول تحديدًا في المشاكل، لكن يبدو من المرجح أن تكون المشاكل مرتبطة ببعضها. ربما يكون لدى شخص آخر في فريق Discourse أفكار حول ما قد يتسبب في إنشاء سجلات مكررة.
هل لا تزال لديك إمكانية الوصول إلى الموقع الذي أنشأت فيه ملف النسخ الاحتياطي؟ إذا كان الأمر كذلك، فإن الحل هو حذف السجل المكرر من قاعدة البيانات ثم إنشاء ملف نسخ احتياطي جديد. للقيام بذلك، ستحتاج إلى الاتصال عبر SSH بالخادم القديم والانتقال (cd) إلى دليل /var/discourse:
cd /var/discourse
ثم قم بتشغيل
./launcher enter app
بعد ذلك، أدخل وحدة تحكم Rails باستخدام الأمر التالي:
rails c
يجب أن ترى بعد ذلك موجهًا يشبه هذا:
[1] pry(main)>
حاول تشغيل الأمر التالي من وحدة تحكم Rails وأخبرنا بما يعيده:
شكرًا لك على التحقق من ذلك! النتيجة التي حصلت عليها هي نفسها التي رأيتها مع موقع آخر في وقت سابق من اليوم. إنها مشكلة قابلة للحل، لكنني سأحاول أن أحصل على أحد مهندسينا لمراجعة ما يحدث.
كان الغرض الأساسي من نقل الخوادم هو أنني كنت أستخدم Debian 8 الذي سيخرج من الدعم.
مع هذه المشكلة المتعلقة بالاستعادة، اتبعت طريق الترقية إلى Debian 9 على نفس الخادم. وقد نجح ذلك، مما منحنا بعض الراحة مؤقتًا.
شكرًا لكم على دعمكم.
يجب عليك إجراء بحث ضبابي (fuzzy search) حتى لا يفترض أن الفهرس يعمل بشكل صحيح. أعتقد أن علامة النسبة المئوية الواحدة كافية إذا كانت في البداية.
يمكنك ببساطة حذف السجل الإضافي. ولكن للقيام بذلك بشكل صحيح، يجب عليك تحديث الجدول الآخر الذي يرتبط بهذا الجدول. يجب علي البحث عن ذلك في كل مرة لأن هناك عدة جداول مختلفة ترتبط ببعضها.
يُلقى باللوم على هذه المشكلة في ملحقات الطرف الثالث، وهو ما لا يبدو منطقياً. يبدو أن الخطأ من postgres، لكنني لا أعرف. أواجه هذه المشكلة عدة مرات في الشهر، يبدو ذلك (النقاط) عبر عدد من المواقع.
أواجه أيضًا مشكلة في مفتاح مكرر، هل توجد طريقة إصلاح موثقة؟
discourse=# REINDEX SCHEMA CONCURRENTLY public;
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
رغم أنني قمت للتو بترقية خادمي مباشرةً، وبالتالي لن أعيد التثبيت على خادم جديد بعد الآن، فقد جربت ذلك بدافع الفضول ولم أجد أي سجلات باستخدام البحث الضبابي:
هذا جيد أن نسمع. لقد كنت أقوم بتحديث الجدول الآخر الذي يرتبط بهذه الصفوف بشكل شاق. إنها عملية مرهقة للغاية لأنني لا أستطيع تذكر ما هو أبدًا، لذا فإنها المرة الأولى التي أكرر فيها ذلك مرارًا وتكرارًا.
حاولت إعادة بناء هذه الفهارس الأربعة يدويًا. نجح اثنان، وفشل اثنان. هل يجب أن أحذف هاتين الصفحتين المكررتين؟
discourse=# REINDEX INDEX CONCURRENTLY "public"."incoming_referers_pkey_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "public"."index_incoming_referers_on_path_and_incoming_domain_id_ccnew";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_cc_ccnew"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1861) is duplicated.
discourse=# REINDEX INDEX CONCURRENTLY "pg_toast"."pg_toast_2782645_index_ccnew";
REINDEX
discourse=# REINDEX INDEX CONCURRENTLY "index_incoming_referers_on_path_and_incoming_domain_id_ccnew1";
ERROR: could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id_c_ccnew1"
DETAIL: Key (path, incoming_domain_id)=(/search/, 1905) is duplicated.
@riking تلف الفهارس في PostgreSQL هو خلل في PostgreSQL نفسه وليس في Discourse. بالتأكيد يمكننا تحسين أداء عملية الإدراج تلك، لكن الخلل في PostgreSQL يتطلب إصلاحًا من قبل فريق PostgreSQL.
أعتقد أن الأمر يتعلق بإغلاق غير لائق لمحرك قاعدة البيانات، ربما بسبب انقطاع التيار الكهربائي.
هذا تفسير معقول. هل يؤدي الأمر ./launcher shutdown app (أو إعادة البناء) إلى إغلاق نظيف لـ postgres بطريقة ما؟ لكنني أراهن أن التحديث غير المراقب لا يعرف كيفية إغلاق حاويات docker بشكل نظيف، أليس كذلك؟