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

9

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

У нас есть 3 среды для наших баз данных:

  • развитие
  • Пользовательское приемочное тестирование (UAT)
  • производство

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

Недавно мы начали использовать элемент управления Red Gate SQL Source для хранения всех наших объектов (с регулярными коммитами).

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

Есть предложения по процессу?

Спасибо

judda
источник
Похоже, что ваши скрипты базы данных не находятся в том же исходном контроле, что и ваш «настоящий» код. Почему это? Можете ли вы относиться к нему как к «исходному коду» и ставить его с отдельными ветками?
Майк М.
В настоящее время мы храним только версию разработки сценариев в системе контроля версий, и UAT / Production не синхронизированы с активной разработкой. Каждый из сценариев в системе контроля версий обновляется каждый раз, когда разработчик делает коммит. Проблема с отдельными филиалами состоит в том, что у нас есть 1 централизованная база данных, которую использует каждый (для больших изменений мы разветвляем отдельные базы данных).
1
Вы можете создать ветку для выпуска и вносить в нее только те изменения, которые относятся к выпуску. Все остальные изменения должны быть внесены в багажник. Для этого вам понадобятся две базы данных разработки. Будет ли это проблемой?
Это звучит так, как будто человек довольно быстро устареет. Нет? Для одного из моих проектов мы находимся в процессе масштабного пересмотра базы данных, поэтому мы выполнили эту ветвь, чтобы активная разработка все еще могла происходить в неизмененной версии базы данных. Тем не менее, каждый день я вижу, как наша разветвленная версия становится все более устаревшей, и я не уверен, нормально ли это или нет ... Мне никогда раньше не приходилось сталкиваться с такими ситуациями, как эта.
Judda

Ответы:

5

Миграции

Вверх и вниз, которые находятся в вашем репо и помечены вместе с вашим приложением.

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

  • держите ваши миграции рядом с исходным кодом, они должны быть версионированы и помечены вместе
  • всегда использовать управляемые изменения (миграции) во всех средах
  • никогда не допускайте специальных модификаций в любых средах

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

dietbuddha
источник
Что произойдет, если в скриптах будет обнаружена ошибка? Вы возвращаетесь к сценарию sql и обновляете его?
Judda
1
Нет, вы создаете новую миграцию (которая увеличивает версию схемы). Вот как вы узнаете, что исправление было развернуто, посмотрев на версию схемы в базе данных.
dietbuddha
Спасибо за помощь. На первый взгляд, это очень надежный подход, похожий на нашу стратегию ветвления.
Judda
2

Управления источником!

Вы не развернете свои двоичные файлы разработки непосредственно в производство, не перейдя через svn / git / p4, так почему бы ваши базы данных сделали это? Получите частные экземпляры для разработчиков, чтобы проверить их локальные изменения, но когда он должен перейти в базу данных разработки, он должен пройти через проверенные в файлах ddl. Вы даже можете написать инструменты для автоматического применения этих изменений ddl (я не знаю ни одного существующего способа сделать это правильно).

Как только у вас появятся ограничения на изменение схемы БД (больше нет sqlplus -> Issue ddl!) И вы получите строгий контроль учетных записей (нет доступа к ddl для всех), это должно стать более управляемым.

Subu Sankara Subramanian
источник
1
К сожалению, наши базы данных слишком велики, чтобы передавать их между разработчиками, чтобы запустить частные сеансы. К тому же, похоже, что на самом деле это не склоняется к развитию команды, потому что на данный момент я делаю бэкэнд-разработку, разговаривая с людьми о работе пользовательского интерфейса, связывающей их. Мне нужно было бы начать с проверки всех изменений, а затем заставить их получать последние данные в базе данных, что представляется довольно большой проблемой.
Judda
Почему ваша база данных для разработки должна быть такого же размера, что и рабочая база данных? Они могут иметь одну и ту же схему, и вы даже можете иметь специальный парк нагрузочного тестирования со всеми данными, но локальные базы данных разработчиков могут быть небольшими. Это также предотвращает проблемы утечки данных и т. Д. - теоретически, данные о продуктах вообще не должны затрагивать разработку.
Субу Шанкара Субраманян
Все наши данные загружаются через наш процесс загрузки данных, который обрабатывает файлы, предоставленные нам от клиента, а затем преобразует их в данные, которые нам нужны. Таким образом, мы не можем разделить данные dev и prod, так как все загрузки данных должны быть проверены в процессе разработки. Я предполагаю, что он не обязательно должен быть такого же размера, ему нужны сопоставимые объемы данных, чтобы отчеты, которые мы создаем, генерировали значимую информацию.
Judda
Вся БД не нуждается в репликации. В Oracle каждый пользователь имеет свою собственную схему, и у нас есть одна схема приложения. Создать общедоступные синонимы для всех объектов в схеме приложения. Тогда каждый пользователь может изменить объекты (таблицы, SP) в своей собственной схеме, и, если они подключатся друг к другу, будут использоваться их имена объектов. Для объектов, которых нет в схеме, должны использоваться синонимы. Вот как мы работаем.
софтведа
0

Следуя предложению об использовании миграций ... возможно, используйте O / RM, который поддерживает миграции, такие как Ruby on Rails и Entity Framework 4.3. Однако проблема обоих подходов заключается в том, что миграция - это все или ничего. Вы не можете (обычно) выбирать, какие Миграции применяются, как вы можете с точки зрения наборов изменений.

Другой жизнеспособный вариант (если вы в стеке Microsoft, вы никогда не упоминали платформу) - это управлять своим SQL с помощью инструментов базы данных Visual Studio. Он имеет встроенный рефакторинг (переименование / удаление столбцов и т. Д.) И выполняет проверку модели. Например, если хранимый процесс ссылается на столбец, которого больше нет, он сообщит вам об этом.

Майкл Браун
источник