أحاول الاستعادة من خادم حديث إلى خادم تم بناؤه اليوم. فشل مع هذا الخطأ. لا أرى ذلك في أي مكان في كود Discourse أو في كود الإضافات.
لست متأكدًا مما يجب فعله بعد ذلك.
[20/9694]
ERROR: function discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() does not exist
EXCEPTION: psql failed: ERROR: function discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() does not exist
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:157:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.
أنا محظوظ لأن الخادم القديم لا يزال قيد التشغيل. لذلك قمت بإعادة بناء التطبيق من خلال المشغل للحصول على الخادم القديم بنفس الإصدار تمامًا مثل التثبيت الجديد. ثم قمت بعمل نسخة احتياطية أخرى عبر سطر الأوامر. عند استعادة هذه النسخة الاحتياطية على التثبيت الجديد، سار كل شيء على ما يرام. يجب أن تجرب هذا. @pfaffman
لقد واجهت هذا أيضًا. أحاول الاستعادة من نظام إنتاج إلى نظام اختبار/تطوير. لقد تحققت أيضًا من تثبيت جميع الإضافات نفسها.
ما هي الإضافة الأخرى التي تستخدم هذا؟ سأتحقق من المصدر الآن…
تأكد من أن مجلد /var/discourse/shared كان فارغًا، أو تم نقله إلى موقع جديد في حال احتجنا إلى استعادته.
قمت بتهيئة نسخة جديدة من discourse باستخدام ./launcher bootstrap <app>.
حاولت الاستعادة مرة أخرى وفشلت بنفس رسالة الخطأ.
بعد ذلك، عندما قمت بعمل نسخة احتياطية من نسخة discourse الجيدة لدي، وجدت الأمر الفعلي الذي ينشئ الدالة. وهو:
CREATE FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
RAISE EXCEPTION 'Discourse: old_notification_id in chat_mention_notifications is readonly';
END
$$;
ALTER FUNCTION discourse_functions.raise_chat_mention_notifications_old_notification_id_readonly() OWNER TO discourse;
ثم حاولت الاستعادة مرة أخرى، وسارت الأمور على ما يرام!
الآن، كان لدي السجل حيث فشلت واعتقدت أنه يمكنني العودة إليه لاحقًا، ولكن السجلات يتم إعادة تعيينها مع كل ميزة نسخ احتياطي/استعادة.
تحسين: سيكون من الجيد وجود سجل للنسخ الاحتياطي/الاستعادة. ربما يوجد واحد ولا أعرف أين هو.
إخلاء مسؤولية: أنا لست شخص دعم من Discourse، لذلك لن أخوض في كيفية الدخول إلى سطر أوامر psql لتشغيل الأوامر المذكورة أعلاه.
المشكلة هي أنه تم الالتزام بـ ترحيل بختم تاريخ أقدم في tests-passed لاحقًا (@nbianca للعلم)، وهذا لا يتم اكتشافه بواسطة بيانات التعريف للإصدار في النسخة الاحتياطية. لقد ذكرت ذلك هنا.
هذا هو الحل. لذا، إما أن تحتاج إلى الحصول على تجزئة الالتزام من خادم المثيل وبناء المثيل الجديد الخاص بك باستخدام هذا الالتزام، أو تحديث المثيل الحالي إلى أحدث إصدار، والذي سيقوم بتشغيل هذا الترحيل، ثم أخذ نسخة احتياطية جديدة.
نعم، ولكن في بعض الأحيان لن تتمكن من تحديث المصدر. وفي هذه الحالة، ستحتاج إلى وضع الوجهة على نفس الالتزام مثل المصدر. لذا فهذه استثناء للحالة العادية حيث يمكنك دائمًا إجراء ترحيل ضمني إلى الأمام أثناء الاستعادة.
صحيح، ويحدث هذا لأن الترحيل لا يحتوي على الطابع الزمني للحظة التي تم فيها الالتزام به، بل الطابع الزمني للحظة التي تم إنشاؤه فيها. في معظم الأحيان لا يهم ذلك ولكن في هذه الحالة كانت هناك 7 أسابيع بين هاتين اللحظتين.
نعم، هذه حالة هامشية مؤسفة. يمكننا محاولة تجنبها في المستقبل أو محاولة التوصل إلى حل متوافق مع الإصدارات السابقة لمنع حدوثها مرة أخرى. ومع ذلك، لا أعتقد أنه يمكننا فعل أي شيء لإصلاحها في هذه الحالة. لقد فات الأوان. مهما فعلنا، سيتطلب دائمًا من مالكي المواقع ترقية موقعهم الوجهة إلى أحدث إصدار.
صحيح، هذه مشكلة مع هذا النوع من التقنيات بشكل عام، إنها مشكلة عامة لـ Ruby on Rails وأيضًا لتطبيقات AR الأخرى مثل PHP Laravel. وكما قلت، لا يحدث هذا كثيرًا، وبمجرد أن تدرك ما يحدث، يكون من السهل التعامل معه أثناء الاستعادة.