Механизмы отслеживания изменений схемы БД [закрыто]

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

Вопрос

Каковы наилучшие методы отслеживания и/или автоматизации изменений схемы БД?Наша команда использует Subversion для контроля версий, и мы смогли таким образом автоматизировать некоторые из наших задач (перенос сборок на промежуточный сервер, развертывание протестированного кода на производственном сервере), но мы по-прежнему выполняем обновления базы данных вручную.Я хотел бы найти или создать решение, которое позволит нам эффективно работать на серверах с разными средами, продолжая использовать Subversion в качестве бэкэнда, через который обновления кода и базы данных передаются на различные серверы.

Многие популярные пакеты программного обеспечения включают сценарии автоматического обновления, которые определяют версию БД и вносят необходимые изменения.Является ли это лучшим способом сделать это даже в большем масштабе (в нескольких проектах, а иногда и в нескольких средах и языках)?Если да, существует ли какой-либо существующий код, упрощающий этот процесс, или лучше просто внедрить собственное решение?Кто-нибудь реализовал что-то подобное раньше и интегрировал его в хуки после фиксации Subversion, или это плохая идея?

Хотя решение, поддерживающее несколько платформ, было бы предпочтительнее, нам определенно необходимо поддерживать стек Linux/Apache/MySQL/PHP, поскольку большая часть нашей работы выполняется на этой платформе.

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

Решение

В мире Rails существует концепция миграций, сценариев, в которых изменения в базе данных вносятся в Ruby, а не в специфичный для базы данных вариант SQL.Ваш код миграции Ruby в конечном итоге преобразуется в DDL, специфичный для вашей текущей базы данных;это делает переключение платформ баз данных очень простым.

Для каждого изменения, которое вы вносите в базу данных, вы записываете новую миграцию.Миграция обычно имеет два метода:метод «вверх», при котором изменения применяются, и метод «вниз», при котором изменения отменяются.Одна команда обновляет базу данных, а также может использоваться для приведения базы данных к определенной версии схемы.В Rails миграции хранятся в отдельной папке в каталоге проекта и проверяются системой контроля версий, как и любой другой код проекта.

Это руководство Oracle по миграции Rails достаточно хорошо охватывает миграцию.

Разработчики, использующие другие языки, рассмотрели миграцию и реализовали свои собственные версии для конкретного языка.я знаю Использование, система миграции PHP, созданная по образцу миграции Rails;возможно, это то, что вы ищете.

Другие советы

Мы используем что-то похожее на bcwoord, чтобы синхронизировать схемы нашей базы данных на 5 различных установках (производственной, промежуточной и нескольких установках для разработки) и создавать резервные копии в системе контроля версий, и это работает довольно хорошо.Я немного уточню:


Для синхронизации структуры базы данных у нас есть один скрипт update.php и несколько файлов с номерами 1.sql, 2.sql, 3.sql и т. д.Скрипт использует одну дополнительную таблицу для хранения текущего номера версии базы данных.Файлы N.sql создаются вручную для перехода от версии (N-1) к версии N базы данных.

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

Скрипт обновления работает следующим образом:

  • Подключитесь к базе данных.
  • Сделайте резервную копию текущей базы данных (потому что вещи воля пойти не так) [mysqldump].
  • Создайте таблицу бухгалтерского учета (называемую _meta), если она не существует.
  • Прочтите текущую ВЕРСИЮ из таблицы _meta.Примите 0, если не найден.
  • Для всех файлов .sql с номером выше VERSION выполняйте их по порядку.
  • Если один из файлов выдал ошибку:откатиться к резервной копии
  • В противном случае обновите версию в таблице бухгалтерского учета до самой последней версии исполняемого файла .sql.

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

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


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

Однако будьте осторожны при вставке запросов из phpMyAdmin! Эти сгенерированные запросы обычно включают имя базы данных, что вам определенно не нужно, поскольку это нарушит ваши сценарии!Что-то вроде СОЗДАТЬ ТАБЛИЦУ mydb.newtable(...) завершится ошибкой, если база данных в системе не называется mydb.Мы создали SVN-перехватчик для предварительного комментария, который запрещает файлы .sql, содержащие mydb строка, что является верным признаком того, что кто-то скопировал/вставил из phpMyAdmin без надлежащей проверки.

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

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

Проблема здесь в том, что разработчикам действительно легко вносить свои собственные локальные изменения в систему контроля версий, чтобы поделиться ими с командой.Я сталкивался с этой проблемой много лет, и меня вдохновили функциональные возможности Visual Studio для профессионалов в области баз данных.Если вам нужен инструмент с открытым исходным кодом с теми же функциями, попробуйте следующее: http://dbsourcetools.codeplex.com/ Получайте удовольствие, - Натан.

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

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

Тогда у вас есть много вариантов:вы можете взять эти сценарии и поместить их в свой SVN вместе с кодом вашего приложения, чтобы он был развернут существующим механизмом.Другой вариант — использовать механизм доставки neXtep:сценарии экспортируются в так называемый «пакет доставки» (сценарии SQL + дескриптор XML), и установщик может понять этот пакет и развернуть его на целевом сервере, обеспечивая при этом структурную согласованность, проверку зависимостей, регистрацию установленной версии и т. д.

Продукт распространяется по лицензии GPL и основан на Eclipse, поэтому работает на Linux, Mac и Windows.На данный момент он также поддерживает Oracle, Mysql и Postgresql (поддержка DB2 находится в разработке).Загляните в вики, где вы найдете более подробную информацию:http://www.nextep-softwares.com/wiki

Сохраните свою схему в файл и добавьте ее в систему контроля версий.Тогда простой diff покажет вам, что изменилось.

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

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

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

К.У Скотта Аллена есть приличная статья или две об управлении версиями схемы, в которой используется концепция сценариев/миграции инкрементного обновления, упомянутая в других ответах здесь;видеть http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx.

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

Затем зафиксируйте сценарий в системе контроля версий вместе с кодом, который с ним работает.Если вам необходимо изменить схему вместе с кодом, сценарий можно вернуть вместе с кодом, требующим измененной схемы.Тогда различия в сценарии будут указывать на различия в изменениях схемы.

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

Если вы используете C#, обратите внимание на Subsonic, очень полезный инструмент ORM, который также генерирует сценарий sql для воссоздания вашей схемы и/или данных.Эти сценарии затем можно поместить в систему контроля версий.

http://subsonicproject.com/

Я использовал следующую структуру проекта базы данных в Visual Studio для нескольких проектов, и она работала очень хорошо:

База данных

Изменение сценариев

0.PreDeploy.sql

1.SchemaChanges.sql

2.DataChanges.sql

3.Разрешения.sql

Создание сценариев

Проксы

Функции

Взгляды

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

1.PreDeploy.sql

2.SchemaChanges.sql

Содержимое папки «Создать сценарии»

2.DataChanges.sql

3.Разрешения.sql

Каждый разработчик проверяет свои изменения на наличие конкретной ошибки/функции, добавляя свой код в конец каждого файла.Как только основная версия будет завершена и разветвлена ​​в системе управления версиями, содержимое файлов .sql в папке Change Scripts будет удалено.

Мы используем очень простое, но эффективное решение.

Для новых установок у нас есть файл метаданных.sql в репозитории, который содержит всю схему БД, затем в процессе сборки мы используем этот файл для создания базы данных.

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

Итак, в нашем программном обеспечении у нас есть что-то вроде этого:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

Этот код проверит, находится ли база данных в версии 1 (которая хранится в таблице, созданной автоматически), если она устарела, то команда выполняется.

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

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

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

Я создаю папки, названные в честь версий сборки, и помещаю туда сценарии обновления и понижения версии.Например, у вас могут быть следующие папки:1.0.0, 1.0.1 и 1.0.2.Каждый из них содержит сценарий, который позволяет вам обновлять или понижать версию вашей базы данных между версиями.

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

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

Как сказал Джоуи, если вы находитесь в мире Rails, используйте миграции.:)

В моем текущем PHP-проекте мы используем идею миграции по рельсам, и у нас есть каталог миграций, в котором мы храним файлы с названием «migration_XX.sql», где XX — номер миграции.В настоящее время эти файлы создаются вручную по мере обновления, но их создание можно легко изменить.

Затем у нас есть скрипт под названием «Migration_watcher», который, поскольку мы находимся на стадии предварительной альфа-версии, в настоящее время запускается при каждой загрузке страницы и проверяет, существует ли новый файл миграции_XX.sql, где XX больше, чем текущая версия миграции.Если это так, он запускает все файлыmigration_XX.sql до наибольшего числа в базе данных и вуаля!изменения схемы автоматизированы.

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

Я бы рекомендовал использовать Ant (кросс-платформенный) для стороны «сценариев» (поскольку он практически может общаться с любой базой данных через jdbc) и Subversion для репозитория исходного кода.Ant позволит вам создать резервную копию вашей базы данных в локальных файлах перед внесением изменений.1.Резервное копирование существующей схемы БД для подачи через ANT 2.Управление версией в подрывной репозитории через ANT 3.отправлять новые операторы sql в базу данных через Ant

В Toad for MySQL есть функция сравнения схем, которая позволяет синхронизировать две базы данных.Это лучший инструмент, который я когда-либо использовал.

ИМХО, у миграции есть огромная проблема:

Обновление с одной версии на другую работает нормально, но новая установка данной версии может занять вечность, если у вас сотни таблиц и длинная история изменений (как у нас).

Просмотр всей истории изменений с момента базовой версии до текущей версии (для сотен баз данных клиентов) может занять очень много времени.

Мне нравится, как Юи обрабатывает миграцию баз данных.Миграция — это, по сути, реализация PHP-скрипта. CDbMigration. CDbMigration определяет up метод, содержащий логику миграции.Также возможно реализовать down метод для поддержки отмены миграции.Альтернативно, safeUp или safeDown может использоваться, чтобы убедиться, что миграция выполняется в контексте транзакции.

Инструмент командной строки Yii yiic содержит поддержку создания и выполнения миграций.Миграции можно применять или отменять как по одной, так и в пакетном режиме.Результатом миграции является код реализации класса PHP. CDbMigration, имеющее уникальное имя на основе отметки времени и имени миграции, указанного пользователем.Все миграции, которые ранее были применены к базе данных, хранятся в таблице миграции.

Для получения дополнительной информации см. Миграция базы данных статья из мануала.

Попробуйте db-deploy — в основном инструмент Java, но работает и с php.

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

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