تتبع وحل سبب انحراف المخطط

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

الآن أراجع نقطة النهاية admin/plugins لكلا عمليتي النشر، فهما متطابقتان بالنسبة لتلك المدرجة، وحالتها، وإصدارها، لذا أنا في حيرة من أمري بعض الشيء. لقد حاولت أيضًا إعادة جميع السمات والمكونات مرة أخرى فقط في حالة عدم حدوث تغيير. كلا الموقعين عند التطبيق 3.1.3، لذا لا يبدو أن هذا هو السبب الجذري في هذه الحالة.

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

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

سأتحقق من تطابق أرقام الالتزام (إذا أمكن).

النسخة الاحتياطية هي لقاعدة البيانات، لذا أشك في أن عدد الإضافات مهم، بل سيضيف ببساطة بيانات الإضافة ولكنه لن يستخدمها فعليًا…

لا أعتقد ذلك، ولكنها بيئة تطوير لذا كل شيء ممكن على ما أعتقد.

هل هناك أي شيء تعرفه في جدول schema_migrations (أو الكود المستنسخ للحاوية) يمكنني التحقق منه يدويًا وربط إصدار المخطط بأي تغيير؟

إعادة تسمية الملف يمكن أن تسمح بتحميل الأشياء عبر الواجهة الرسومية، لكنني كنت أستخدم merger الذي يمنع بناءً على max(schema_migrations) وأنا حقًا أحاول تجنب تعديل الأشياء كثيرًا.

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

إعجاب واحد (1)
rails db:version

من سطر الأوامر في دليل discourse… ولكن إذا لم تكن قد استعدت، فقد لا يساعد ذلك…

أو من psql:

SELECT * FROM schema_migrations ORDER BY version DESC LIMIT 1;

يمكنك بعد ذلك البحث عن ذلك على Github للمقارنة مع الالتزام…

على سبيل المثال: https://github.com/search?q=repo%3Adiscourse%2Fdiscourse+20231222030024&type=code

تصفح ملف الترحيل ثم لاحظ الالتزام عند إضافته لتأكيد التاريخ وما إلى ذلك.

ملاحظة: هذا ليس بالضرورة نفس التزام الكود بالطبع! قد يكون أقدم :slight_smile: (والذي يمكنك الحصول عليه git log -1)

نعم، يمكنني رؤية أقصى قيمة لـ schema_migration (حتى بمجرد النظر إلى اسم ملف النسخ الاحتياطي)، ولكني تحققت من الجدول وهو مجرد قيمة تاريخ. لا توجد مؤشرات على مصدره.

على سبيل المثال، “الجيد” هو 20230823100627 والموقع هو 20231022224833. لا يمكنني حتى العثور على ملفات لـ “20231022” في مجلد post_migrate (أو في أي مكان آخر في المستودع).

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

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

انتظر، هل تحاول استعادة نسخة تطوير إلى قاعدة بيانات إنتاجية أو العكس؟

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

في هذه الحالة، إنها نسخة Dev إلى نسخة “دمج” تم توفيرها حديثًا والتي سأستخدمها بعد ذلك للدمج لاستيراد نسخة Dev أخرى كجهد لتوحيد المثيلات قيد التنفيذ. تزامن إصدار ترحيل المخطط هو شرط مسبق (ليس مفاجئًا). في هذه الحالة، البيئة المستهدفة على 1022 والمصدر هو 0823. في جميع إصدارات 3.1.3 التي لدي، نحن 0823، لذلك كان الأمر محيرًا من أين جاء 1022 وهذا ما أحاول استنتاجه، لكن لا يمكنني العثور على أي أثر.

حسنًا، سير عملك غريب جدًا!

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

لدمج مثيلين للتطوير متباعدين، هل ستقوم عادةً بدمج الكود، بما في ذلك عمليات الترحيل، ثم إنشاء مثيل جديد من الصفر؟

هذا جزئيًا سبب وجود مهمة “rake” لطيفة لملء بعض البيانات المسبقة حتى يكون هناك شيء للعمل به: rake dev:populate

إعجابَين (2)

لدينا قاعدة بيانات تحتوي على جميع معرفات الترحيل لـ 400+ مكون إضافي حتى نتمكن من ربطها بمكون إضافي بسهولة. هذا يأتي من discourse-automation.

3 إعجابات

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

ونحن وجدنا القطعة المفقودة بالنظر إلى نظام ملفات النسخة.

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

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

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

بالمناسبة، البحث في Github هو صديقك هنا

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

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

@RGJ هل هناك أي فرصة لأن تكون قاعدة البيانات هذه متاحة للعامة في أي مكان؟ استخدام نظام ملفات المثيل “يعمل” ولكنه يصبح أكثر فوضوية مما أفضل.

تقصد أن الناس لم يدفعوا التزاماتهم؟

ما الذي تحاول إنقاذه؟

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

لدينا 3 أو 4 مثيلات من Discourse بدأتها فرق مستقلة لحل مشكلة عمل مشتركة ونحن نرى ما إذا كان بإمكاننا جلب الجميع إلى مثيل واحد مع عدم فقدان عملهم السابق.

لا أصدق أنها ممارسة جيدة الاعتماد على الاحتفاظ بالبيانات في بيئة التطوير (dev).

إذا كانت البيانات مهمة، فيجب أن يكون هذا العمل موجودًا في بيئة الإنتاج (Production) في ظل ظروف أكثر تحكمًا.

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

نعم :100:

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

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

حسناً، أنت تقوم بنمذجة دمج قواعد بيانات الإنتاج، هذا مثير للاهتمام.

ولكن ما الذي تحاول دمجه؟

هل تعلم أن نقل المواضيع (ومستخدميها!) بين النسخ مدعوم رسمياً؟:

نعم، إنها آلاف المواضيع الحالية والمحتوى ذي الصلة، لذا فإن المواضيع الفردية هي فوضى بعض الشيء

Merge two Discourse sites into one والذي يستخدم نصًا برمجيًا مختلفًا، ولكن نفس الفكرة الأساسية.

اكتشفت فارقًا آخر في المخططات. لذلك قمنا بإزالة المكون الإضافي للأتمتة من النشر وأعدنا النشر. ثم لاحظت أن schema_migration بدا وكأنه عاد إلى 0823 كأحدث إصدار. لذلك اعتقدت أنني سأكون على ما يرام دون تثبيت المكون الإضافي للأتمتة في المثيل الذي أقوم بدمجه فيه. حسنًا، عندما قمت بتشغيل الاستيراد مرة أخرى، حصلت على خطأ PG::UndefinedTable: ERROR: relation "discourse_automation_automations" does not exist، لذلك على الرغم من أن إصدار الترحيلات قد تراجع، إلا أن التغييرات في المخطط المرتبطة به في قاعدة البيانات الفعلية كانت لا تزال موجودة على ما يبدو.

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