كيف تدير قواعد البيانات في التطوير والاختبار والإنتاج؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

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

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

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

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

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

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

وهذا هو أكبر عائق أراه في التحرك نحو التكامل المستمر والبناء بخطوة واحدة.كيف أنت حلها؟


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


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

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


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

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

المحلول

هناك بضعة خيارات جيدة.لن أستخدم استراتيجية "استعادة نسخة احتياطية".

  1. قم بكتابة كل تغييرات المخطط الخاص بك، واطلب من خادم CI الخاص بك تشغيل تلك البرامج النصية على قاعدة البيانات.احصل على جدول إصدار لتتبع إصدار قاعدة البيانات الحالي، وقم بتنفيذ البرامج النصية فقط إذا كانت لإصدار أحدث.

  2. استخدم حل الترحيل.تختلف هذه الحلول حسب اللغة، لكن بالنسبة لـ .NET أستخدم Migrator.NET.يتيح لك ذلك إصدار إصدار قاعدة البيانات الخاصة بك والتنقل لأعلى ولأسفل بين الإصدارات.تم تحديد المخطط الخاص بك في كود C#.

نصائح أخرى

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

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

ألق نظرة على كيفية قيام Ruby on Rails بذلك.

أولاً، هناك ما يسمى بملفات الترحيل، والتي تقوم أساسًا بتحويل مخطط قاعدة البيانات والبيانات من الإصدار N إلى الإصدار N+1 (أو في حالة الرجوع من الإصدار N+1 إلى N).تحتوي قاعدة البيانات على جدول يوضح الإصدار الحالي.

يتم دائمًا مسح قواعد بيانات الاختبار قبل اختبارات الوحدة وملؤها بالبيانات الثابتة من الملفات.

الكتاب إعادة هيكلة قواعد البيانات:تصميم قاعدة البيانات التطورية قد تعطيك بعض الأفكار حول كيفية إدارة قاعدة البيانات.نسخة قصيرة يمكن قراءتها أيضًا على http://martinfowler.com/articles/evodb.html

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

  • قم بتسمية قواعد البيانات الخاصة بك على النحو التالي - db_dev , db_test , db_qa , db_prod (من الواضح أنه لا ينبغي عليك أبدًا ترميز أسماء قواعد البيانات
  • وبالتالي ستتمكن من نشر أنواع مختلفة من قواعد البيانات على نفس الخادم الفعلي (لا أوصي بذلك، ولكن قد تضطر إلى...إذا كانت الموارد محدودة)
  • تأكد من أنك ستتمكن من نقل البيانات بين تلك البيانات تلقائيًا
  • افصل البرامج النصية لإنشاء قاعدة البيانات عن المجموعة = يجب أن يكون من الممكن دائمًا إعادة إنشاء قاعدة البيانات من البداية وتعبئتها (من إصدار قاعدة البيانات القديم أو مصدر البيانات الخارجي
  • لا تستخدم سلاسل اتصال التعليمات البرمجية الثابتة في التعليمات البرمجية (حتى ليس في ملفات التكوين) - استخدم في ملفات التكوين قوالب سلسلة الاتصال، والتي تقوم بتعبئتها ديناميكيًا، فكل عملية إعادة تكوين لطبقة التطبيق التي تحتاج إلى إعادة ترجمة تكون سيئة
  • استخدم إصدار قاعدة البيانات وإصدار كائنات قاعدة البيانات - إذا كنت تستطيع تحمل تكاليف ذلك، فاستخدم المنتجات الجاهزة، وإذا لم تقم بتطوير شيء ما بنفسك
  • تتبع كل تغيير في DDL واحفظه في جدول المحفوظات ( مثال هنا )
  • النسخ الاحتياطية اليومية!اختبر مدى السرعة التي ستتمكن بها من استعادة شيء مفقود من نسخة احتياطية (استخدم نصوص الاستعادة التلقائية
  • حتى قاعدة بيانات DEV الخاصة بك وPROD لهما نفس البرنامج النصي للإنشاء، ستواجه مشكلات مع البيانات، لذا اسمح للمطورين بإنشاء النسخة الدقيقة من المنتج واللعب بها (أعلم أنني سأتلقى سلبيات لهذا، ولكن قم بالتغيير في ستكلفك العقلية وعملية الأعمال أقل بكثير عندما تصطدم بالمعجبين - لذا أجبر المبرمجين على الاشتراك بشكل قانوني في كل ما يقومون به، ولكن تأكد من هذا

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

  • dbChanges_1.sql
  • dbChanges_2.sql
  • ...
  • dbChanges_n.sql

لقد نجح هذا بشكل جيد حتى بدأنا في الحفاظ على خطين من التطوير:الجذع/الخط الرئيسي للتطوير الجديد، وفرع الصيانة لإصلاح الأخطاء، والتحسينات قصيرة المدى، وما إلى ذلك.حتما، نشأت الحاجة إلى إجراء تغييرات على المخطط في الفرع.في هذه المرحلة، كان لدينا بالفعل dbChanges_n+1.sql في Trunk، لذلك انتهى بنا الأمر باستخدام مخطط مثل ما يلي:

  • dbChanges_n.1.sql
  • dbChanges_n.2.sql
  • ...
  • dbChanges_n.3.sql

مرة أخرى، نجح هذا الأمر بشكل جيد، إلى أن نظرنا ذات يوم إلى الأعلى ورأينا 42 نصًا دلتا في الخط الرئيسي و10 في الفرع.ARGH!

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

لذلك، أنا لست راضيا عن هذا أيضا.أنا حقًا أحب مفهوم الهجرات من Rails.لقد أصبحت مفتونًا جدًا LiquiBase.وهو يدعم مفهوم إعادة هيكلة قاعدة البيانات المتزايدة.إنه يستحق المشاهدة وسأنظر فيه بالتفصيل قريبًا.أي شخص لديه خبرة في ذلك؟سأكون فضوليًا جدًا لسماع نتائجك.

يمكنك أيضًا النظر في استخدام أداة مثل مقارنة SQL لكتابة الفرق بين الإصدارات المختلفة لقاعدة البيانات، مما يسمح لك بالترحيل بسرعة بين الإصدارات

لدينا إعداد مشابه جدًا لـ OP.

يتطور المطورون في أجهزة افتراضية باستخدام قواعد بيانات خاصة.

[سوف يلتزم المطورون قريبًا بالفروع الخاصة]

يتم تشغيل الاختبار على أجهزة مختلفة (في الواقع في VM المستضافة على خادم) [سيتم تشغيله قريبًا بواسطة Hudson CI Server

اختبار عن طريق تحميل التفريغ المرجعي في قاعدة البيانات.قم بتطبيق تصحيحات مخطط المطورين ثم قم بتطبيق تصحيحات بيانات المطورين

ثم قم بإجراء اختبارات الوحدة والنظام.

يتم نشر الإنتاج للعملاء كمثبتين.

الذي نفعله:

نحن نأخذ تفريغ المخطط لقاعدة بيانات Sandbox الخاصة بنا.ثم تفريغ بيانات SQL.نحن نفرق ذلك عن خط الأساس السابق.هذا الزوج من الدلتا هو ترقية n-1 إلى n.

نقوم بتكوين المقالب والدلتا.

لذا، لتثبيت الإصدار N CLEAN، نقوم بتشغيل التفريغ في قاعدة بيانات فارغة.للتصحيح، قم بتطبيق الرقع المتداخلة.

(ذكر جحا أن فكرة Rail المتمثلة في وجود جدول يسجل إصدار قاعدة البيانات الحالي هي فكرة جيدة وينبغي أن تجعل تثبيت التحديثات أقل صعوبة.)

يجب مراجعة دلتا ومقالب قبل الاختبار التجريبي.لا أستطيع أن أرى أي طريقة للتغلب على هذا الأمر حيث رأيت المطورين يقومون بإدخال حسابات اختبارية في قاعدة البيانات لأنفسهم.

تفحص ال com.dbdeploy, ، هناك أدوات Java و.net متاحة بالفعل، ويمكنك اتباع معاييرها الخاصة بتخطيطات ملفات SQL وجدول إصدار المخطط وكتابة إصدار python الخاص بك.

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

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

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

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

إذا كنت في بيئة .NET فالحل هو تارانتينو.إنه يتعامل مع كل هذا (بما في ذلك البرامج النصية SQL التي سيتم تثبيتها) في بناء NANT.

لقد كتبت أداة (من خلال ربطها بـ افتح DBDiff) يقارن مخططات قاعدة البيانات، وسيقترح عليك برامج نصية للترحيل.إذا قمت بإجراء تغيير يؤدي إلى حذف البيانات أو تعديلها، فسوف يؤدي ذلك إلى ظهور خطأ، ولكنه سيقدم اقتراحًا للبرنامج النصي (على سبيل المثال.عندما يكون هناك عمود مفقود في المخطط الجديد، فإنه سيتم التحقق مما إذا كان قد تمت إعادة تسمية العمود وإنشاء xx - تم إنشاء script.sql.suggestion يحتوي على بيان إعادة التسمية).

http://code.google.com/p/migrationscriptgenerator/ أخشى أن SQL Server فقط هو :( إنه أيضًا ألفا جدًا، لكنه منخفض الاحتكاك جدًا (خاصة إذا قمت بدمجه مع Tarantino أو http://code.google.com/p/simplescriptrunner/)

الطريقة التي أستخدمها هي أن يكون لديك مشروع نصوص SQL في .sln الخاص بك.لديك أيضًا قاعدة بيانات db_next محليًا والتي يمكنك إجراء التغييرات عليها (باستخدام Management Studio أو تصدير مخطط NHibernate أو LinqToSql إنشاء قاعدة البيانات أو شيء ما).ثم تقوم بتنفيذ ترحيل برنامج نصي باستخدام قواعد البيانات _dev و_next، مما يؤدي إلى إنشاء.البرامج النصية لتحديث SQL للترحيل عبرها.

نحن نستخدم سطر الأوامر فرق الخلية:يُخرج فرقًا بين مخططي قاعدة البيانات (من قاعدة البيانات المباشرة أو البرنامج النصي) كبرنامج نصي ALTER.يتم تنفيذ mysql-diff عند بدء التطبيق، وإذا تغير المخطط، فسيتم إبلاغ المطور به.لذلك لا يحتاج المطورون إلى كتابة التعديلات يدويًا، حيث تحدث تحديثات المخطط بشكل شبه تلقائي.

لقاعدة بيانات أوراكل نستخدمها أوراكل-ddl2svn أدوات.

تعمل هذه الأداة على أتمتة العملية التالية

  1. لكل مخطط ديسيبل احصل على مخطط ddls
  2. وضعه تحت التحكم في الإصدار

يتم حل التغييرات بين الحالات يدويًا

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