Мені важко було намагатися знайти хороші приклади того, як керувати схемами та даними бази даних між серверами розробки, тестування та виробництва.
Ось наша установка. У кожного розробника є віртуальна машина, на якій працює наш додаток та база даних MySQL. Це їхня особиста пісочниця - робити все, що завгодно. В даний час розробники вносять зміни в схему SQL і роблять скидання бази даних в текстовий файл, який вони здійснюють у SVN.
Ми хочемо розгорнути сервер розробки безперервної інтеграції, на якому завжди буде працювати останній наданий код. Якщо ми зробимо це зараз, він перезавантажить базу даних з SVN для кожної збірки.
У нас є тестовий (віртуальний) сервер, на якому працює "випуск кандидатів". Розгортання на тестовому сервері в даний час є дуже ручним процесом, і зазвичай передбачає завантаження останнього SQL з SVN та налаштування його. Також дані на тестовому сервері несумісні. Ви закінчуєте будь-які тестові дані, які останній розробник здійснив на своєму сервері пісочниці.
Де все руйнується - це розгортання у виробництво. Оскільки ми не можемо перезаписати живі дані тестовими даними, це передбачає повторне створення всіх змін схеми вручну. Якщо для маніпулювання даними було велика кількість змін схем або скриптів перетворення, це може стати дуже волохатим.
Якщо проблема була лише схемою, це було б простішою проблемою, але в базі даних є "базові" дані, які також оновлюються під час розробки, такі як метадані в таблицях безпеки та дозволів.
Це найбільший бар'єр, який я бачу у просуванні до постійної інтеграції та побудови в один крок. Як ти це вирішуєш?
Подальше запитання: як відстежувати версії бази даних, щоб ви знали, які сценарії потрібно запустити для оновлення певного екземпляра бази даних? Чи згадується таблиця версій на зразок Ланс нижче стандартної процедури?
Дякуємо за посилання на Тарантино. Я не в середовищі .NET, але я знайшов їхню вікі-сторінку DataBaseChangeMangement дуже корисною. Особливо ця презентація Powerpoint (.ppt)
Я збираюся написати скрипт Python, який перевіряє назви *.sql
скриптів у даному каталозі на предмет таблиці в базі даних і запускає ті, яких немає там, для того, щоб грунтуватися на ціле число, яке формує першу частину імені файлу. Якщо це досить просте рішення, як я підозрюю, воно буде, тоді я його опублікую тут.
У мене є робочий сценарій для цього. Він обробляє ініціалізацію БД, якщо її немає, та запускає сценарії оновлення за необхідності. Також є комутатори для протирання наявної бази даних та імпортування тестових даних з файлу. Це близько 200 рядків, тому я не публікую його (хоча, якщо є інтерес, я можу поставити його на пастібін).