Как вы управляете базами данных при разработке, тестировании и производстве?

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

  •  08-06-2019
  •  | 
  •  

Вопрос

Мне было трудно найти хорошие примеры того, как управлять схемами баз данных и данными между серверами разработки, тестирования и производства.

Вот наша установка.У каждого разработчика есть виртуальная машина, на которой работает наше приложение и база данных MySQL.Это их личная песочница, где они могут делать все, что хотят.В настоящее время разработчики внесут изменения в схему SQL и сделают дамп базы данных в текстовый файл, который они сохранят в SVN.

Мы хотим развернуть сервер разработки непрерывной интеграции, на котором всегда будет выполняться последний зафиксированный код.Если мы сделаем это сейчас, база данных из SVN будет перезагружаться для каждой сборки.

У нас есть тестовый (виртуальный) сервер, который запускает «Кандидаты выпуска». Развертывание на тестовом сервере в настоящее время является очень ручным процессом, и обычно меня загружает последний SQL из SVN и настраиваю его.Кроме того, данные на тестовом сервере противоречивы.В конечном итоге вы получите те тестовые данные, которые последний разработчик, зафиксировавший данные, хранил на своем сервере песочницы.

Где все ломается, так это развертывание в производство.Поскольку мы не можем перезаписать текущие данные тестовыми данными, для этого потребуется вручную заново создать все изменения схемы.Если для манипулирования данными было выполнено большое количество изменений схемы или сценариев преобразования, это может стать очень сложной задачей.

Если бы проблема заключалась только в схеме, это было бы проще, но в базе данных есть «базовые» данные, которые также обновляются во время разработки, например метаданные в таблицах безопасности и разрешений.

Это самый большой барьер, который я вижу на пути к непрерывной интеграции и одноэтапному построению.Как ты Найди решение?


Последующий вопрос:как отслеживать версии базы данных, чтобы знать, какие сценарии запускать для обновления конкретного экземпляра базы данных?Является ли таблица версий, подобная упоминаемой Лэнсом ниже, стандартной процедурой?


Спасибо за ссылку на Тарантино.Я не работаю в среде .NET, но нашел их Вики-страница DataBaseChangeMangement быть очень полезным.Особенно это Презентация Powerpoint (.ppt)

Я собираюсь написать скрипт Python, который проверяет имена *.sql сценарии в заданном каталоге сравниваются с таблицей в базе данных и запускают те, которых там нет, по порядку, основываясь на целом числе, которое образует первую часть имени файла.Если это довольно простое решение, как я подозреваю, то я опубликую его здесь.


У меня есть рабочий сценарий для этого.Он выполняет инициализацию БД, если она не существует, и при необходимости запускает сценарии обновления.Также имеются переключатели для очистки существующей базы данных и импорта тестовых данных из файла.Там около 200 строк, поэтому я не буду его публиковать (хотя могу выложить на Pastebin, если будет интерес).

Это было полезно?

Решение

Есть пара хороших вариантов.Я бы не стал использовать стратегию «восстановления резервной копии».

  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 (очевидно, вам никогда не следует жестко запрограммировать имена баз данных.
  • Таким образом, вы сможете развернуть даже разные типы баз данных на одном физическом сервере (я не рекомендую это делать, но вам, возможно, придется...если ресурсов мало)
  • Убедитесь, что вы сможете автоматически перемещать данные между ними.
  • Отделите сценарии создания базы данных от заполнения = всегда должна быть возможность воссоздать базу данных с нуля и заполнить ее (из старой версии базы данных или внешнего источника данных).
  • не используйте жестко заданные строки подключения в коде (даже не в файлах конфигурации) — используйте в файлах конфигурации шаблоны строк подключения, которые вы заполняете динамически, каждая реконфигурация application_layer, требующая перекомпиляции, является ПЛОХОЙ
  • используйте управление версиями баз данных и объектов БД — если вы можете себе это позволить, используйте готовые продукты, если не разрабатывайте что-то самостоятельно.
  • отслеживать каждое изменение DDL и сохранять его в некоторой таблице истории ( пример здесь )
  • ЕЖЕДНЕВНЫЕ резервные копии!Проверьте, насколько быстро вы сможете восстановить что-то потерянное из резервной копии (используйте сценарии автоматического восстановления).
  • даже ваша база данных DEV и PROD имеют один и тот же сценарий создания, у вас будут проблемы с данными, поэтому позвольте разработчикам создавать точную копию продукта и играть с ним (я знаю, что получу минусы за это, но измените в мышление и бизнес-процесс будут стоить вам гораздо меньше, когда дерьмо попадет в вентилятор - так что заставьте программистов легально подписываться на все, что они делают, но убедитесь, что это

Это то, чем я постоянно недоволен — наше решение этой проблемы.В течение нескольких лет мы поддерживали отдельный сценарий изменений для каждого релиза.Этот сценарий будет содержать изменения из последнего производственного выпуска.С каждым выпуском приложения номер версии будет увеличиваться, что даст примерно следующее:

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

Это работало достаточно хорошо, пока мы не начали поддерживать два направления разработки:Trunk/Mainline для новых разработок и ветка обслуживания для исправления ошибок, краткосрочных улучшений и т. д.Неизбежно возникла необходимость внести изменения в схему в ветке.На этом этапе у нас уже был dbChanges_n+1.sql в магистрали, поэтому в итоге мы использовали следующую схему:

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

Опять же, это работало достаточно хорошо, пока однажды мы не посмотрели и не увидели 42 дельта-скрипта в основной ветке и 10 в ветке.ААА!

В наши дни мы просто поддерживаем один дельта-скрипт и позволяем SVN его версии, т.е.мы перезаписываем сценарий с каждым выпуском.И мы избегаем внесения изменений в схему в ветках.

Так что меня это тоже не устраивает.Мне очень нравится концепция миграции из Rails.Я был очень очарован ЛиквиБейс.Он поддерживает концепцию инкрементного рефакторинга базы данных.Это стоит посмотреть, и я скоро рассмотрю это подробно.У кого-нибудь есть опыт работы с этим?Мне было бы очень интересно услышать о ваших результатах.

Вы также можете посмотреть использование такого инструмента, как SQL-сравнение для создания сценария разницы между различными версиями базы данных, что позволяет быстро переходить между версиями

У нас очень похожая установка на ОП.

Разработчики работают на виртуальных машинах с частными БД.

[Разработчики скоро перейдут на частные ветки]

Тестирование запускается на разных машинах (на самом деле в виртуальной машине, размещенном на сервере) [скоро будет запущен Hudson CI Server

Проверьте, загрузив эталонный дамп в базу данных.Примените патчи схемы разработчиков, затем примените исправления данных разработчиков

Затем запустите модульные и системные тесты.

Производство развертывается клиентам в качестве монтажников.

Что мы делаем:

Мы берем дамп схемы нашей песочницы БД.Затем дамп данных sql.Мы сравниваем это с предыдущим базовым уровнем.эта пара дельт должна обновить n-1 до n.

настраиваем дампы и дельты.

Итак, чтобы установить версию N CLEAN, мы запускаем дамп в пустую базу данных.Для исправления примените промежуточные исправления.

(Юха упомянул, что идея Rail о наличии таблицы, записывающей текущую версию БД, является хорошей и должна сделать установку обновлений менее обременительной.)

Перед бета-тестированием необходимо просмотреть дельты и дампы.Я не вижу никакого способа обойти это, поскольку видел, как разработчики сами вставляли тестовые учетные записи в БД.

Проверьте dbdeploy, уже доступны инструменты Java и .net, вы можете следовать их стандартам для макетов файлов SQL и таблицы версий схемы и написать свою версию Python.

Боюсь, я согласен с другими авторами.Разработчикам необходимо записывать свои изменения в сценарии.

Во многих случаях простой ALTER TABLE не будет работать, вам также необходимо изменить существующие данные — разработчикам нужно подумать о том, какие миграции требуются, и убедиться, что они правильно написаны (конечно, вам нужно тщательно протестировать это в какой-то момент в цикл выпуска).

Более того, если у вас есть хоть немного здравого смысла, вы попросите своих разработчиков также написать сценарий отката для их изменений, чтобы их можно было отменить в случае необходимости.Это также следует протестировать, чтобы гарантировать, что их откат не только выполняется без ошибок, но и оставляет БД в том же состоянии, в котором она была раньше (это не всегда возможно или желательно, но в большинстве случаев это хорошее правило). .

Как подключить это к CI-серверу, я не знаю.Возможно, вашему CI-серверу необходим известный снимок сборки, к которому он возвращается каждую ночь, а затем применяет все изменения, внесенные с тех пор.Вероятно, это лучше всего, иначе неработающий сценарий миграции сломает не только ночную сборку, но и все последующие.

Если вы находитесь в среде .NET, то решение Тарантино.Он обрабатывает все это (в том числе, какие SQL-скрипты устанавливать) в сборке NANT.

Я написал инструмент, который (подключившись к Открыть DBDiff) сравнивает схемы баз данных и предлагает вам сценарии миграции.Если вы внесете изменение, которое удаляет или изменяет данные, оно выдаст ошибку, но предложит сценарий (например,когда столбец отсутствует в новой схеме, он проверит, был ли столбец переименован, и создаст сгенерированный xx скрипт.sql.suggestion, содержащий оператор переименования).

http://code.google.com/p/migrationscriptgenerator/ Боюсь, только SQL Server :( Это тоже довольно альфа-версия, но с ОЧЕНЬ низкими трудностями (особенно если вы объедините его с Тарантино или http://code.google.com/p/simplescriptrunner/)

Я использую его для размещения проекта сценариев SQL в вашем .sln.У вас также есть локальная база данных db_next, в которую вы вносите изменения (используя Management Studio или Экспорт схемы NHibernate или LinqToSql Создать базу данных или что-то).Затем вы выполняете миграционный скрипт-генератор с базами данных _dev и _next, который создает.сценарии обновления SQL для миграции.

Мы используем командную строку MySQL-разница:он выводит разницу между двумя схемами базы данных (из действующей БД или сценария) в виде сценария ALTER.mysql-diff выполняется при запуске приложения, и если схема изменилась, он сообщает об этом разработчику.Таким образом, разработчикам не нужно писать ALTER вручную, обновления схемы происходят полуавтоматически.

Для базы данных Oracle мы используем оракул-ddl2svn инструменты.

Этот инструмент автоматизировал следующий процесс

  1. для каждой схемы БД получить схему DDLS
  2. поставь под контроль версий

изменения между экземплярами разрешаются вручную

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top