Подтвердить что ты не робот

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

Это, кажется, пропущенная область, которая действительно может использовать некоторое понимание. Каковы ваши лучшие практики для:

  • процедура обновления
  • резервное копирование в случае ошибок
  • синхронизирующий код и изменения базы данных
  • тестирование перед развертыванием
  • механика изменения таблицы

и т.д...

4b9b3361

Ответ 1

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

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

клиентский дизайн - это то, где метод встроенного SQL-кода (даже с подготовленными инструкциями) позволяет вам попасть в неприятности. Вы можете потратить AGES просто на поиск этих утверждений. Если вы используете что-то вроде Hibernate и помещаете столько SQL в именованные запросы, у вас есть одно место для большей части sql (ничего хуже, чем пытаться протестировать sql, который находится внутри некоторого оператора IF, и вы просто не попадаете в "триггер", критерии в вашем тестировании для этого оператора IF). Прежде чем использовать спящий режим (или другие руны), когда я буду делать SQL непосредственно в JDBC или ODBC, я бы поместил все операторы sql в виде открытых полей объекта (с соглашением об именах) или в файле свойств (также с именованием соглашение для значений, например PREP_STMT_xxxx, и использовать либо отражение, либо итерацию по значениям при запуске в а) тестовых случаях; b) запуск приложения (некоторые rdbms позволяют предварительно компилировать подготовленные операторы перед выполнением, поэтому при запуске после входа в систему я будет предварительно компилировать prep-stmts при запуске, чтобы сделать самотестирование приложения.Даже для 100 заявлений на хорошем rdbms это всего лишь несколько секунд и только один раз, и он сохранил мой прикладом много. В одном проекте DBA (другая команда, в другой стране), и схема, казалось, менялась НОЧЬЯ, без всякой причины. И каждое утро мы получили список того, где именно оно сломало приложение при запуске.

Если вам нужна функциональность adhoc, поместите ее в хорошо названный класс (т.е. снова соглашение об именах помогает при автоматическом тестировании), который действует как какой-то factory для вашего запроса (т.е. строит запрос). Вам все равно придется писать эквивалентный код, просто введите место, где вы можете его проверить. Вы даже можете написать некоторые базовые методы тестирования на одном и том же объекте или в отдельном классе.

Если вы можете, попробуйте также использовать хранимые процедуры. Их немного сложнее проверить, как указано выше. Некоторые db также не предварительно проверяют sql в хранимых процедурах против схемы во время компиляции только во время выполнения. Обычно речь идет о том, чтобы взять копию структуры схемы (без данных), а затем создать все сохраненные процедуры против этой копии (в случае, если команда db, внесшая изменения, не проверила корректно). Таким образом, можно проверить структуру. но в качестве точки управления изменениями хранятся procs. Поменять все получится. Особенно, когда изменения db являются результатом изменений бизнес-процесса. И все языки (java, vb, etc) получают изменения)

Обычно я также настраиваю таблицу, которую я использую, называемую system_setting и т.д. В этой таблице мы сохраняем идентификатор VERSION. Это значит, что клиентские библиотеки могут подключаться и проверять, действительны ли они для этой версии схемы. В зависимости от изменений вашей схемы вы не хотите разрешать клиентам подключаться, если они могут повредить вашу схему (т.е. У вас нет большого количества ссылочных правил в db, но на клиенте). Это зависит от того, будете ли вы также иметь несколько клиентских версий (что происходит в NON-веб-приложениях, то есть они работают с неправильным двоичным кодом). У вас также могут быть пакетные инструменты и т.д. Другой подход, который я также сделал, - это определить набор схем для операционных версий в каком-либо файле свойств или снова в таблице system_info. Эта таблица загружается при входе в систему, а затем используется каждым "менеджером" (обычно у меня есть какая-то клиентская сторона api, чтобы делать большую часть материала db), чтобы проверить эту операцию, если она является правильной версией. Таким образом, большинство операций могут преуспеть, но вы также можете провалить (выбросить какое-то исключение) на устаревшие методы и сообщить вам ПОЧЕМУ.

управление изменением схемы → обновляете ли вы таблицу или добавляете отношения 1-1 к новым таблицам? По этой причине я видел много магазинов, которые всегда получают доступ к данным. Это позволяет изменять имена таблиц, столбцы и т.д. Я играл с идеей фактически обрабатывать представления, такие как интерфейсы в COM. то есть. вы добавляете новый VIEW для новых функций/версий. Зачастую, что вам нужно, так это то, что у вас может быть много отчетов (особенно пользовательских отчетов конечных пользователей), которые принимают форматы таблиц. Представления позволяют развертывать новый формат таблицы, но поддерживают существующие клиентские приложения (помните все эти досадные отчеты adhoc).

Также необходимо написать сценарии обновления и отката. и снова TEST, TEST, TEST...

------------ OKAY - ЭТО ВРЕМЯ ДИСКУССИИ СЛУЧАЙНОГО БИТВА --------------

На самом деле был крупный коммерческий проект (т.е. магазин программного обеспечения), где у нас была та же проблема. Архитектура была 2 уровня, и они использовали продукт, немного похожий на PHP, но pre-php. То же самое. другое название. во всяком случае, я вошел в версию 2....

Это стоило МНОГО ДЕНЕГ сделать обновления. Много. то есть. отдайте недели бесплатного времени на консультацию на месте.

И это доходило до того, что хотелось либо добавить новые функции, либо оптимизировать код. Некоторые из существующих кодов использовали хранимые процедуры, поэтому у нас были общие точки, где мы могли управлять кодом. но в других областях была эта встроенная разметка sql в html. Это было здорово для быстрого выхода на рынок, но при каждом взаимодействии новых функций стоимость, по меньшей мере, удваивалась для тестирования и обслуживания. Поэтому, когда мы смотрели на то, чтобы вытащить код типа php, вставляя слои данных (это был 2001-2002, до ORM и т.д.) И добавляли много новых функций (отзывы клиентов), рассматривали этот вопрос о том, как разрабатывать UPGRADES в систему. Что немаловажно, так как апгрейды стоят много денег, чтобы делать правильно. Теперь большинство моделей и все другие вещи, которые люди обсуждают со степенью энергии, имеют дело с OO-кодом, который работает, но как насчет того факта, что ваши данные должны: a) интегрироваться в эту логику, b) значение, а также структуру данные могут меняться со временем, а часто из-за того, как работают данные, вы получаете множество подпроцессов/приложений в организации ваших клиентов, которым нужны эти данные → специальная отчетность или любая сложная пользовательская отчетность, а также пакетные задания которые были сделаны для пользовательских каналов данных и т.д.

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

Идея заключалась в том, чтобы применить представление COM/Interface к тому, как клиенты получали доступ к данным через набор таблиц CONCRETE (которые изменялись с изменениями схемы). Вы можете создать отдельное представление для каждой операции типа - обновить, удалить, вставить и прочитать. Это важно. Представления будут либо сопоставляться непосредственно с таблицей, либо позволять вам запускать фиктивную таблицу, которая делает реальные обновления или вставки и т.д. То, что я действительно хотел, было какой-то косвенной степенью косвенности, которую все еще можно было использовать в отчетах о кристаллах и т.д. ПРИМЕЧАНИЕ. - Для вставок, обновления и удаления вы также можете использовать сохраненные procs. И у вас была версия для каждой версии продукта. Таким образом, у вашей версии 1.0 была своя версия схемы, и если бы таблицы были изменены, у вас все равно была бы версия VIEWS версии 1.0, но с новой логикой backend для сопоставления с новыми таблицами по мере необходимости, но у вас также были представления версии 2.0, которые поддерживали бы новые поля и т.д. Это было действительно просто для поддержки специальных отчетов, которые, если ваш человек BUSINESS, а не кодер, вероятно, весь смысл того, почему у вас есть продукт. (ваш продукт может быть дерьмом, но если у вас есть лучшая отчетность в мире, которую вы все равно можете выиграть, обратное верно - ваш продукт может быть лучшей функцией мудрый, но если это хуже при отчетности, вы можете очень легко потерять).

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

Ответ 2

LiquiBase

liquibase.org:

  1. он понимает определения гибернации.
  2. он генерирует лучшее обновление схемы sql, чем hibernate
  3. он регистрирует, какие обновления были сделаны в базу данных
  4. он обрабатывает двухэтапные изменения (т.е. удаляет столбец "foo", а затем переименовывает другой столбец в "foo")
  5. он обрабатывает концепцию условных обновлений
  6. разработчик на самом деле слушает сообщество (в спящем режиме, если вы не в толпе "новичок" или новичок - вас в основном игнорируют.)

http://www.liquibase.org

Ответ 3

мнение

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

Ответ 4

В общем, мое правило: "Приложение должно управлять собственной схемой".

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

У меня был большой успех, используя функцию Hibernates SchemaUpdate для управления структурами таблиц. Оставляя сценарии обновления только для обработки фактической инициализации данных и случайного удаления столбцов (SchemaUpdate этого не делает).

Что касается тестирования, так как обновления являются частью приложения, тестирование их становится частью цикла тестирования для приложения.

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

Ответ 5

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

Ответ 6

Это все веские темы, но вот моя рекомендация по обновлению.

Вы не указали свою платформу, но для среды сборки NANT я использую Tarantino. Для каждого обновления базы данных, которое вы готовы совершить, вы вносите изменения script (используя RedGate или другой инструмент). Когда вы создаете для производства, Tarantino проверяет, был ли script запущен в базе данных (он добавляет таблицу в вашу базу данных для отслеживания). Если нет, запускается script. Из управления версиями базы данных требуется вся ручная работа (читай: человеческая ошибка).

Ответ 8

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

Если есть только один dev, как в одном проекте, я сейчас (ha), я просто передаю изменения схемы как текстовые файлы SQL в репозиторий CVS, которые я проверяю партиями на производственном сервере, когда код изменения входят.

Но липибаза лучше организована, чем это!