القضبان:أفضل طريقة لإجراء تغييرات على قاعدة بيانات الإنتاج

StackOverflow https://stackoverflow.com/questions/205793

سؤال

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

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

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

هل كانت مفيدة؟

المحلول

وهذا يبدو وكأنه كنت في حالة حيث لا مخطط إنتاج ديسيبل تتطابق تماما ما كنت تستخدم في ديف (على الرغم من أنه ليس من الواضح تماما). وأود أن رسم خط في الرمال، والحصول على هذا ديسيبل همز في حالة أفضل. أساسا ما تريد القيام به هو التأكد من أن ديسيبل همز لديه "schema_info" جدول يسرد أي الهجرات التي تقوم> لا <أي وقت مضى تريد أن تعمل في الإنتاج. ثم يمكنك إضافة الهجرات إلى المحتوى قلوبكم وأنها سوف تعمل ضد ديسيبل الإنتاج.

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

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

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

نصائح أخرى

أنا دائما أتبع هذا الإجراء:

  • تفريغ قاعدة بيانات المنتج باستخدام الأمر mysqldump
  • قم بتعبئة قاعدة بيانات التطوير/الاختبار مع التفريغ باستخدام أمر mysql
  • قم بتشغيل عمليات الترحيل في dev/test
  • التحقق من عمل الترحيل
  • تفريغ قاعدة بيانات المنتج باستخدام أمر mysqldump (لأنه قد يكون قد تغير) مع الاحتفاظ بنسخة احتياطية على الخادم
  • تشغيل عمليات الترحيل على المنتج (باستخدام capristano)
  • لقد نجح اختبار الترحيل على المنتج
  • شرب البيرة (أثناء مشاهدة سجلات الأخطاء)

هل هناك سبب لا تستخدم نفس الهجرات التي استخدمتها في بيئة ديف لديك؟

وإضافة عمود مع add_column في الهجرة يجب أن تكون غير المدمرة: أنه سيتم إنشاء "ALTER TABLE" بيان. إذا كنت تعرف ما أنت ذاهب لوضعها في الأعمدة خلقت مرة واحدة، يمكنك ملء القيم في الهجرة (يمكنك اختيار بديل أقل استهلاكا للوقت إذا كانت التهم الصف كبيرة).

وإزالة أو تغيير تعريف العمود هو، في اعتقادي، التي تعتمد على منصة: بعض سيسمح حذف عمود في مكان، والبعض الآخر إجراء تسلسل إعادة تسمية-إنشاء حدد الإفلات من الأوامر

.

لتحصل على أكثر تحديدا، نحن بحاجة الى مزيد من المعلومات: أي نوع من الهجرة تبحثون في، ما منصة تركض على، لا تحتاج إلى تعيين القيم كجزء من الهجرة؟ سوف أشياء من هذا القبيل تساعد كثيرا - مجرد تعديل على السؤال، الذي سيدفع إعادته قائمة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top