Как вы версии и синхронизируете свою модель данных MySQL?

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

Вопрос

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

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

create table dog (
  uid int,
  name varchar(50)
);

И завтра я решу, что хочу записать пород каждой собаки тоже. Поэтому я изменяю файл SQL для чтения:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Этот скрипт будет работать в производстве для первого выпуска, но он не поможет мне обновить мою базу данных разработки, потому что ERROR 1050 (42S01): Table 'dog' already exists. Отказ Кроме того, он не будет работать в производстве, если это изменение было сделано после первого выпуска. Так что мне действительно нужно ALTER Таблица сейчас.

Так что теперь у меня есть два опасения:

  1. Это то, как я должен сохранить мою модель данных (куча создания утверждений в файле SQL), а также
  2. Как я должен применять изменения в моей базе данных?

Моя цель - выпустить изменения точно и включить непрерывную интеграцию. Я использую инструмент, называемый ddlsync, найдя и применять разницу в базе данных Oracle, но я не уверен, что существуют аналогичные инструменты для MySQL.

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

Решение

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

Файлы пронумерованы последовательно. Мы отслеживаем отслеживание файлов обновлений, запускаемую, сохраняя эту информацию в базе данных. Сценарий вставляет строку с именем файла при выполнении файла, и обновляет строку с временем завершения, когда выполнение заканчивается. Это обернуто внутри транзакции. (Стоит вспомнить, что команды DDL в MySQL не могут произойти в транзакции. Любая попытка выполнить DDL в транзакции, вызывает неявный коммит.)

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

Мы объединяем эту систему обновления с помощью (необязательно) Nightly Wipe нашей базы данных Dev, заменив содержимое резервной копии живой системы прошлой ночи. После восстановления резервного копирования резервное обновление запускается, с любыми ожидающимися файлами обновлений получают в процессе.

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

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

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

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

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