فشل الاستعادة بسبب المفتاح (plugin_name, key)=(discourse-data-explorer, q:-1) مكرر

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

لقد قمت بحذف جميع الإضافات، بما في ذلك الإضافات الرسمية وغير الرسمية، لكن المشكلة لا تزال قائمة.

لذلك حاولت استعادة النسخة الاحتياطية، لكنني وجدت الرسالة التالية:

[2020-07-12 01:16:20] ERROR:  could not create unique index "index_plugin_store_rows_on_plugin_name_and_key"
[2020-07-12 01:16:20] DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.
[2020-07-12 01:16:20] EXCEPTION: psql failed: DETAIL:  Key (plugin_name, key)=(discourse-data-explorer, q:-1) is duplicated.

[2020-07-12 01:16:20] /var/www/discourse/lib/backup_restore/database_restorer.rb:95:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:49:in `run'
/var/www/discourse/lib/backup_restore.rb:188:in `block in start!'
إعجاب واحد (1)

هناك بيانات تالفة في متجر الإضافات.

إذا لم تكن تهتم بأي من البيانات المخصصة التي حفظتها في مستكشف البيانات، جرب ما يلي:

./launcher enter app
rails c
PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
4 إعجابات
root@HFT-app:/var/www/discourse# rails c
[1] pry(main)> PluginStore.where(plugin_name: 'discourse-data-explorer').delete_all
NoMethodError: undefined method `where' for PluginStore:Class
Did you mean?  when
from (pry):1:in `__pry__'
[2] pry(main)>


يبدو أن هناك خطأ ما.

هل يمكنك تزويدي بمزيد من المعلومات؟

يجب أن يكون PluginStoreRow وليس PluginStore. جرّب هذا:

./launcher enter app
rails c
PluginStoreRow.where(plugin_name: 'discourse-data-explorer').delete_all

:warning: سيؤدي هذا إلى حذف جميع بيانات data-explorer من موقعك بشكل لا رجعة فيه

4 إعجابات

إذن ماذا يجب أن أفعل؟
المنتدى غير قابل للقراءة الآن، ويبدو أن ملف latest.json قد فُقد.

سأحاول إعادة بناء التطبيق. إذا لم ينجح ذلك، فراجع /logs بحثًا عن أخطاء.

إعجاب واحد (1)

كيفية عرض السجلات؟

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


2020/07/14 11:33:39 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory


#------




2020-07-14 11:33:42.023 UTC [49] LOG:  database system is ready to accept connections
I, [2020-07-14T11:33:46.972466 #1]  INFO -- :
I, [2020-07-14T11:33:46.972792 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
2020-07-14 11:33:47.025 UTC [62] postgres@postgres ERROR:  database "discourse" already exists
2020-07-14 11:33:47.025 UTC [62] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2020-07-14T11:33:47.026573 #1]  INFO -- :
I, [2020-07-14T11:33:47.026936 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2020-07-14 11:33:47.083 UTC [73] postgres@discourse ERROR:  role "discourse" already exists
2020-07-14 11:33:47.083 UTC [73] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists


مرحبًا، كيف يمكنني تشغيل الكود من فضلك؟

@xiasummer

فقط إذا كان لديك نسخة احتياطية كاملة ومُؤَكَّدَة لقاعدة بياناتك الحالية ومجلد التحميلات (uploads)، يمكنك نقل أو نسخ تلك النسخة (تلك النسخ) خارج المجلد المشترك، على سبيل المثال (مع تكييف الأمر حسب إعداداتك):

mv  /var/discourse/shared  /tmp

تأكد أولاً من وجود نسخ احتياطية كاملة لقاعدة البيانات، بطبيعة الحال.

بعد ذلك، يمكنك إعادة البناء من الصفر:

./launcher rebuild app

ثم يمكنك استعادة البيانات من سطر الأوامر:

cp -rf /tmp/shared/backups/default /var/discourse/shared/standalone/backups

بعدها يمكنك إجراء عملية الاستعادة من سطر الأوامر باستخدام أحدث نسخة احتياطية بالطريقة المعتادة.

ستؤدي هذه العملية إلى استعادة نسخة احتياطية من التطبيق إلى حالتها وقت آخر نسخة احتياطية جَيِّدَة وكاملة.

يُنصح بهذه الطريقة فقط إذا كان لديك نسخة احتياطية كاملة وحديثة لقاعدة البيانات بأكملها وملفات التحميلات.

إذا قمت بنسخ احتياطي دون تضمين ملفات التحميلات، يمكنك بالطبع العثور عليها في /tmp/shared/standalone/uploads ونسخها على النحو التالي:

cp -rf /tmp/shared/standalone/uploads/* /var/discourse/shared/standalone/uploads

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

rm -rf /tmp/shared

هذه إحدى الطرق للمضي قدمًا.

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

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.