خطأ Index_users_on_username_lower أثناء استعادة قاعدة البيانات: فشل الاستيراد

مرحبًا!

في الليلة الماضية، واجهت مشكلة كبيرة في منتدى واضطررت إلى إعادة إنشاء كل شيء. لكن أثناء الاستعادة، واجهت مشكلة وفشلت العملية. إليك الخطأ:

ERROR:  could not create unique index "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(lea) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (username_lower)=(lea) is duplicated.

أعتقد أن هذا قد يكون مرتبطًا بتسجيل الدخول عبر تويتر، لكن هل يمكن لعملية الاستعادة تغيير اسم username_lower إذا كان مكررًا؟ لا أظن أنني سأتمكن من تعديله في ملف SQL (لأنه كبير جدًا) ثم إعادة رفعه.

حالة أخرى من تلف فهرس قاعدة البيانات كما ذُكر سابقًا هنا Critical Error: changed username, user got broken

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

كانت هناك مشكلة مختلفة، حيث لم يتمكن الخادم من الوصول إلى pups.git، ولم يتمكن من حل اسم المضيف: github.com. لقد جربت بعض الحلول التي عثرت عليها الليلة الماضية، لكنها لم تنجح.

مع الاستعادة، أعتقد أن المشكلة تتعلق باسم مستخدم واحد فقط (ربما مرتبط بإنشاء حساب تويتر بنقرة واحدة، أو شيء من هذا القبيل). أحاول إصلاحها يدويًا، لكن إدارة ملف SQL بحجم 1 جيجابايت ليست مثالية.

تعديل: باستخدام برنامج vim، تمكنت من تعديل ملف SQL، وعثرت على الأسطر الصحيحة. استُعيدت العملية بنجاح. أحتاج فقط إلى إعادة بناء كل شيء وسيكون جاهزًا للتشغيل.

كان هناك اسم مستخدم “Lea” واسم مستخدم “lea”. من الغريب أن يسمح Discourse بذلك. إنه منتدى قديم نسبيًا (يونيو 2014)، وقمت بتحديثه بشكل متكرر، لذا ربما كان ذلك بسبب إصدار معين.

كان اليوم جنونيًا، لكنني سأحاول شرح كيفية إصلاح كل شيء إذا كان حظك سيئًا جدًا مثل حظي :upside_down_face:

  1. قم بتنزيل النسخة الاحتياطية. ثم قم بفك ضغطها عدة مرات حتى تحصل على ملف dump.sql.

  2. قم بتحرير ملف dump.sql باستخدام برنامج مثل vim download : vim online

  3. أنا ضعيف جدًا في SQL. للعثور على الجدول الصحيح، بحثت عن username_lower,. ما وجهني إلى جدول المستخدمين، ثم بحثت عن “lea”. قمت بتحرير مدخلات Lea الاثنين. ربما كان الأمر أسهل بكثير، لكن تذكر أنني ضعيف في SQL، خاصة عندما يكون حجم الملف 1.5 جيجابايت. احفظ الملف.

  4. قمت بضغط ملف dump.sql باستخدام 7zip. يجب أن يكون لديك ملف جديد باسم: dump.sql.gz.

  5. أنشئ مجلدًا جديدًا في:file_folder: /var/discourse/shared/standalone/backups/default/. استخدمت اسم test.

  6. إذا كان لديك اتصال إنترنت جيد، قم برفع مجلد :file_folder: uploads الذي حصلت عليه عند فك ضغط ملف النسخة الاحتياطية، وضع المجلد في /var/discourse/shared/standalone/backups/default/test/.
    6.1 إذا لم يكن لديك اتصال جيد مثلي، فيجب عليك استخدام خادمك. لاحظ اسم ملف النسخة الاحتياطية الخاص بك واستخدم الأمر التالي: tar xvzf /var/discourse/shared/standalone/backups/default/yourbackupfile.tar.gz -C /var/discourse/shared/standalone/backups/default/test.
    6.2 في مجلد test، ستجد ملف dump.sql.gz ومجلد uploads. هذا جيد.

  7. قم برفع ملف dump.sql.gz من مجلد test الخاص بك لاستبدال ملف dump.sql.gz التالف.

  8. في خادمك: انتقل إلى cd /var/discourse/shared/standalone/backups/default/test.

  9. تحتاج إلى إعادة إنشاء ملف النسخة الاحتياطية الخاص بك. يجب أن تستخدم الاسم الدقيق لملف النسخة الاحتياطية الأقدم: tar -czvf yourbackupfile.tar.gz uploads/ dump.sql.gz.

  10. في برنامج FTP الخاص بك، انتقل إلى :file_folder: /var/discourse/shared/standalone/backups/default/، ثم احذف النسخة الاحتياطية التالفة أو انقلها إلى مجلد آخر.

  11. انقل ملف النسخة الاحتياطية الجديد إلى /var/discourse/shared/standalone/backups/default/.

  12. استعد النسخة الاحتياطية. أنا أفضل استخدام هذه الطريقة، وإذا وصلت إلى هنا، فيجب أن تكون قادرًا على استخدامها بسهولة: Restore a backup from the command line

يجب أن تنجح عملية استعادة النسخة الاحتياطية :sweat_smile:

سهل.