عمليات الـ Migrations التي لن تسبب تعطل بيئة الإنتاج
تعمل عملية الـ migration بشكل مثالي على جهازك. تقوم بنشرها يوم الجمعة في الساعة 6 مساءً لأنها تبدو بسيطة. ثم يتجمد النشر. أو الأسوأ من ذلك، يتوقف جدول يحتوي على 8 ملايين صف عن الاستجابة لمدة 40 ثانية وينهار موقعك.
تتصرف الـ Migrations بشكل مختلف في بيئة الإنتاج (Production). قواعد البيانات المحلية فارغة وسريعة، بينما قواعد بيانات الإنتاج تحتوي على بيانات حقيقية ومستخدمين نشطين.
اتبع هذه القواعد لتجنب كوارث بيئة الإنتاج.
اكتب دائماً دالة
downتعمل بشكل صحيح تحتاج كل migration إلى دالتيupوdown. يجب أن تعكس دالةdownدالةupتماماً. إذا لم تتمكن من كتابة عملية تراجع (rollback)، فإن الـ migration الخاصة بك معقدة للغاية. اختبرها على جهازك باستخدامmigrateمتبوعة بـmigrate:rollbackقبل الرفع.لا تقم أبداً بتعديل الـ migrations القديمة قد ترغب في إصلاح حجم عمود في ملف migration قديم. لا تفعل ذلك. لن يقوم Laravel بتشغيل ذلك الملف مرة أخرى على الخادم. بدلاً من ذلك، أنشئ migration جديدة لتغيير الهيكل. الـ Migration هي سجل للتغييرات؛ أنت تضيف فصولاً جديدة بدلاً من إعادة كتابة الفصول القديمة.
استخدم القيم القابلة للإلغاء (nullable) أو القيم الافتراضية (default) إضافة عمود
NOT NULLإلى جدول يحتوي على بيانات موجودة مسبقاً يسبب أخطاءً، لأن قاعدة البيانات لا تعرف ما الذي يجب وضعه في الصفوف القديمة.
استخدم هذه الأساليب بدلاً من ذلك:
• اجعل العمود الجديد nullable.
• ضع قيمة افتراضية (default value).
• إذا كان العمود مطلوباً، فقم بذلك عبر ثلاث خطوات: أنشئه كـ nullable ، ثم املأ البيانات، ثم قم بتغييره إلى NOT NULL.
فقدان البيانات أمر دائم يقوم أمر
dropColumnبحذف البيانات للأبد. يمكن لعملية الـ rollback إعادة إنشاء العمود، ولكن البيانات التي بداخله ستضيع. قبل حذف أي عمود، تحقق من النسخ الاحتياطية الخاصة بك. الطريقة الأكثر أماناً هي التوقف عن استخدام العمود في الكود الخاص بك أولاً، والانتظار لبضعة أسابيع، ثم حذفه من قاعدة البيانات.افصل بين تغييرات المخطط (schema) وتحديثات البيانات تشغيل
User::all()داخل migration قد يؤدي إلى تحميل ملايين الصفوف في الذاكرة مما يتسبب في انهيار عملية النشر. إذا كان لابد من تحديث البيانات أثناء الـ migration، فاستخدمchunkByIdلمعالجة السجلات في دفعات صغيرة.استخدم علم
--forceفي خطوط الأنابيب (pipelines) ستتوقف خطوط أنابيب النشر الآلية (automated deployment pipelines) عن العمل إذا طلب Laravel تأكيداً. استخدم هذا الأمر في سكربتات النشر الخاصة بك:php artisan migrate --forceاحذر من أقفال الجداول (table locks) تغيير عمود أو إضافة فهرس (index) على جدول ضخم يؤدي إلى قفل ذلك الجدول، مما يتسبب في توقف الخدمة (downtime). بالنسبة للجداول الكبيرة جداً، ابحث في أدوات تغيير المخطط عبر الإنترنت (online schema change tools) أو قم بإجراء التغييرات خلال ساعات انخفاض حركة المرور.
قائمة التحقق قبل الرفع:
• هل تعمل دالة down؟
• هل اختبرت الـ rollback محلياً؟
• هل أقوم بإنشاء migration جديدة بدلاً من تعديل واحدة قديمة؟
• هل العمود الجديد nullable أم لديه قيمة افتراضية؟
• هل لدي نسخة احتياطية قبل حذف الأعمدة؟
المصدر: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o
