Рекомендуемый подход, как изменить схему производственной базы данных SQL? - PullRequest
5 голосов
/ 18 июля 2010

Скажем, есть база данных с более чем 100 таблицами и добавлена ​​основная функция, которая требует изменения 20 существующих таблиц и еще 30 добавленных. Изменения были сделаны в течение длительного времени (6 месяцев) несколькими разработчиками в базе данных разработки. Давайте предположим, что изменения не делают какие-либо существующие производственные данные недействительными (например, для добавленных столбцов допустимы значения / пустые значения по умолчанию, нет новых отношений или ограничений, которые не могут быть выполнены).

Какой самый простой способ опубликовать эти изменения в схеме в производственной базе данных? Желательно, не останавливая базу данных на продолжительное время.

Ответы [ 4 ]

6 голосов
/ 18 июля 2010

Напишите скрипт T-SQL, который выполняет необходимые изменения.Протестируйте его на копии рабочей базы данных (восстановите из последней резервной копии, чтобы получить копию).Исправьте неизбежные ошибки, которые обнаружит тест.Повторяйте до тех пор, пока скрипт не будет работать идеально.

Затем, когда наступит время для фактической миграции: заблокируйте БД, чтобы только администраторы могли войти в систему. Сделайте резервную копию.Запустите скрипт.Проверьте результаты.Переведите БД в оперативный режим.

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

3 голосов
/ 18 июля 2010

Не существует общего ответа о том, как вносить «изменения» без простоев. Ответ действительно зависит от случая к случаю, в зависимости от того, какие именно изменения. Некоторые изменения не влияют на время простоя (например, добавление новых таблиц), некоторые изменения оказывают минимальное влияние (например, добавление столбцов в существующие таблицы без изменения размера данных, как, например, новый обнуляемый столбец, который не увеличивает размер нулевого растрового изображения) и другие изменения приведут к хаосу во время простоя (любая операция, которая изменит размер данных, приведет к перестроению индекса и индексированию и блокировке таблицы на время). Некоторые изменения невозможно применить без * значительного * простоя. Мне известны случаи, когда изменения были применены параллельно: создается копия базы данных, настраивается репликация, чтобы поддерживать ее актуальность, затем копия изменяется и сохраняется в синхронизации, и, наконец, операции перемещаются в измененную копию, которая становится основная база данных. На PASS 2009 есть презентация, сделанная Мишель Аффорд , в которой упоминается, как крестный отец пережил такое изменение, которое длилось недели .

Но в меньшем масштабе вы должны применить изменения с помощью хорошо протестированного сценария и измерить влияние на оценку теста.

Но на самом деле вопрос заключается в следующем: будут ли последние изменения, которые вы когда-либо вносили в схему? Наконец, вы обнаружили идеальную схему для приложения, и рабочая база данных никогда не изменится? Поздравляю, как только вы это сделаете, вы можете отправиться отдыхать. Но реально вы столкнетесь с той же проблемой через 6 месяцев. настоящая проблема заключается в вашем процессе разработки с разработчиками и внесением изменений из SSMS или VS Server Explore прямо в базу данных. Ваш процесс разработки должен предпринять сознательные усилия для принятия стратегии изменения схемы, основанной на версиях и сценариях T-SQL, подобно описанной в Контроль версий и вашей базе данных .

2 голосов
/ 18 июля 2010

Используйте инструмент, чтобы создать скрипт diff и запустить его во время окна обслуживания. Я использую RedGate SQL Compare для этого и был очень доволен этим.

1 голос
/ 18 июля 2010

Я успешно использую dbdeploy уже пару лет. Это позволяет вашим разработчикам создавать небольшие дельты изменений SQL, которые затем можно применить к вашей базе данных. Изменения отслеживаются таблицей изменений в базе данных, чтобы она знала, что применять.

http://dbdeploy.com/

...