كيف يمكنك الإصدار وتزامن نموذج بيانات MySQL الخاص بك؟

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

سؤال

ما هي أفضل طريقة لحفظ نموذج بيانات MySQL الخاص بي وتطبيق التغييرات تلقائيًا على خادم قاعدة بيانات التطوير الخاص بي عند صنعه (أو على الأقل ليلا)؟

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

create table dog (
  uid int,
  name varchar(50)
);

وغداً ، قررت أنني أريد تسجيل سلالة كل كلب أيضًا. لذلك أقوم بتغيير ملف SQL لقراءة:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

سيعمل هذا البرنامج النصي في الإنتاج للإصدار الأول ، لكنه لن يساعدني في تحديث قاعدة بيانات التطوير الخاصة بي بسبب ERROR 1050 (42S01): Table 'dog' already exists. علاوة على ذلك ، لن يعمل في الإنتاج إذا تم إجراء هذا التغيير بعد الإصدار الأول. لذلك أنا حقا بحاجة لذلك ALTER الجدول الآن.

حتى الآن لدي اثنين من الاهتمامات:

  1. هل هذه هي الطريقة التي يجب أن أحفظ بها نموذج البيانات الخاص بي (حفنة من البيانات في ملف SQL) ، و
  2. كيف يمكنني تطبيق تغييرات مثل هذه على قاعدة البيانات الخاصة بي؟

هدفي هو إطلاق التغييرات بدقة وتمكين التكامل المستمر. أستخدم أداة تسمى DDLSync تجد وتطبيق الفرق في قاعدة بيانات Oracle ، لكنني لست متأكدًا من الأدوات المماثلة الموجودة لـ MySQL.

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

المحلول

في العمل ، قمنا بتطوير نص صغير لإدارة إصدار قاعدة البيانات لدينا. كل تغيير إلى أي جدول أو مجموعة من البيانات يحصل على ملف SQL الخاص به.

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

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

نحن نجمع بين نظام التحديث هذا مع مسح ليلي (اختياري) من قاعدة بيانات DEV الخاصة بنا ، لتحل محل المحتويات مع النسخ الاحتياطي لنظام Live Live في الليلة الماضية. بعد استعادة النسخ الاحتياطي ، يتم تشغيل التحديث ، مع تشغيل أي ملفات تحديث معلقة في العملية.

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

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

نصائح أخرى

هناك أدوات قياسية لهذا في العديد من الأطر: يحتوي Rails على شيء يسمى الهجرات, ، شيء يتم تكراره بسهولة في PHP أو أي لغة مماثلة.

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