5/26/2009 2:04:18 PM

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

Есть несколько баз данных: дивелоперская, тестовая (та, на которой выполняются юнит и функциональны тесты), UAT (user acceptance test), на которой работают тестеры и немножко – маркетеры, pre-production (используется для проведения презентаций и т.д). В свете очень скорого релиза предполагается появление одной и более production базы данных.

Дивелоперская версия “эволюционирует” в режиме реального времени, в то время, как обновление UAT происходит автоматически по расписанию (это делает Team Build) и, понятное дело, нужно производить обновление базы данных в момент обновления продукта, то есть, в составе этого самого билда. Остальные базы – та же история, в момент обновления инсталяции.

Кроме того, понятное дело, каждая база данных хранит свои собственные данные. То есть, содержимое всех баз абсолютно разное и должно оставаться абсолютно разным. А вот структура данных должна быть одинаковая. Структура – это и схема БД, и состояние данных. То есть, если по каким-то причинам вдруг понадобилось увеличить цену продуктов на 20% (дурацкий пример), то сделать это нужно во всех базах, а продукты везде разные.

В общем, мы пробовали пользоваться различным софтом для сравнения и синхронизации схем БД, автоматизировать его, как-то проверять периодически на предмет, не напутал ли он чего (ведь может быть в девелоперской базе есть что-то, что и не нужно, чтобы было больше нигде), а уж DML эти (это я про “увеличить цену” как отслеживать…

В общем, мы пришли к очень простому, но действенному методу. Я, кстати, не верил, что будет так эффективно, когда начинали. Оказалось – очень неплохо.

Смысл метода заключается в том, что все изменения, которые делаются в БД, делаются посредством SQL-скриптов (а я предупреждал, что метод простой).
Скрипты, согласно конвенции, именуются в порядке очередности: 00129.sql, 00130.sql и т.д. Они хранятся в папке scripts одного из проектов в solution.
База данных содержит табличку SchemaVersion с одним числовым полем (TFS поступает так же, если я не ошибаюсь).
Проект, в котором это все лежит, называется DatabaseMigrator. Все, что он делает – читает из config-файла connection strings, подключается к базам, смотрит в SchemaVersion и исполняет скрипты, версия (имя) которых выше, чем то, что находится в БД. Выполнил – обновил версию.
Вот и все.
А дальше – для каждой конфигурации – просто свой app.config-файл. Team Build запускает DatabaseMigrator каждый раз, когда делает обновление UAT. Другие билды, которые обновляют другие инсталяции, делают то же самое.

Работать с этим всем совсем просто: каждый раз, когда мне нужно изменить схему, поменять структуру данных или что-то еще, я создаю sql-файлик и запускаю migrator. Прошло – отлично, дивелоперская и тестовая базы обновлены, можно работать. UAT и прочее – обновятся своевременно. При этом если я что-то напортачил в скрипте, то просто “упадет” билд – и ничего не сломается на существующей инсталяции.

Tags:

Comments (3) -

5/26/2009 3:09:11 PM

Crypto

Накат скриптов - единственно цивилизованный способ. Smile
У нас практически тоже самое.
Есть base script(который периодически шринкается, например, при смене major version), все изменения в БД оформляются программистами в отдельные скрипты, их сбором и расфасовкой по версиям занимается отдельный человек. Важное условие - скрипты должны быть re-runnable, это решает кучу проблем, хотя и усложняет немного сами скрипты.
Накатом занимается также отдельная самописная прога (у нас она называется UpgradeDatabase Smile ), которую мы прикрутили к билд процессу и в инсталлер.

Crypto

5/27/2009 8:12:37 AM

WondeRu

Алексей, добрый день,

Мы поступаем несколько иначе:
Есть проект обновления БД (как у вас), он в ресурсах хранит скрипты, но они именуются по номеру билда 1.0.4.2.sql. Информация о каждом файле хранится в конфигурационном xml-файле, который имеет следующие вхождения "номер билда" - "скрипт". Также есть таблица в БД с версией, читаем версию билда, находим все скрипты, что выше по версии и запускаем. Хранение именно номера билда необходимо для того, чтобы программа при запуске проверяла свою версию и сравнивала с версией БД, т.е. на другой версии БД просто не запустимся. Также есть режим создания БД, когда запускается один большой скрипт. Разработчики при создании скрипта обновления БД, также правят и основной скрипт.

WondeRu Russia

5/27/2009 10:28:37 AM

Alexey Raga

WondeRu, с билдами была мысль, но решили не делать так по следующим причинам:
- База эволюционирует для дивелоперов и для UAT (куда версия заливается минимум дважды в день). Это - текущий процесс и никакой смены номера билда, конечно, не происходит.
- Программисту гораздо проще создать файл со "следующим" номером в имени, чем думать о номере билда и поддерживать необходимый файл.
- Когда команда работает, то за день может появиться до 10, а то и больше, апдейт-скриптов. Разные люди - разные файлы.
- Именами и версиями скриптов рулит система контроля версий. То есть, мы не храним скрипты в ресурсах. Просто когда TeamBuild забирает из source control проект, он забирает и скрипты, там же билдит migrator, там же его и запускает и делает deploy. В случае веб-инсталяции огромного проекта (несколько серверов на инсталяцию) это оправдано, так как ни о каких инсталяторах, конечно, речи идти не может Smile

Alexey Raga

Comments are closed

Powered by BlogEngine.NET 2.5.0.6

About the author

Alexey Raga Alexey Raga
.NET software developer.

E-mail me Send mail

Twitter


Recent posts

Archive

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2012

Sign in