Как вы версии и синхронизируете свою модель данных MySQL?
-
26-09-2019 - |
Вопрос
Какой лучший способ сохранить мою модель данных 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
Таблица сейчас.
Так что теперь у меня есть два опасения:
- Это то, как я должен сохранить мою модель данных (куча создания утверждений в файле SQL), а также
- Как я должен применять изменения в моей базе данных?
Моя цель - выпустить изменения точно и включить непрерывную интеграцию. Я использую инструмент, называемый ddlsync, найдя и применять разницу в базе данных Oracle, но я не уверен, что существуют аналогичные инструменты для MySQL.
Решение
На работе мы разработали небольшой скрипт для управления вариантом для базы данных. Каждое изменение в любой таблице или набор данных получает свой собственный файл SQL.
Файлы пронумерованы последовательно. Мы отслеживаем отслеживание файлов обновлений, запускаемую, сохраняя эту информацию в базе данных. Сценарий вставляет строку с именем файла при выполнении файла, и обновляет строку с временем завершения, когда выполнение заканчивается. Это обернуто внутри транзакции. (Стоит вспомнить, что команды DDL в MySQL не могут произойти в транзакции. Любая попытка выполнить DDL в транзакции, вызывает неявный коммит.)
Поскольку файлы SQL являются частью нашего репозитория исходного кода, мы можем создать запуск сценариев обновления частью обычного процесса развертывания. Это делает сохранение базы данных и код синхронизации, так как пирог. Честно говоря, самая трудная часть - это убедиться, что другой разработчик не схватил следующий номер в ожидании комминика.
Мы объединяем эту систему обновления с помощью (необязательно) Nightly Wipe нашей базы данных Dev, заменив содержимое резервной копии живой системы прошлой ночи. После восстановления резервного копирования резервное обновление запускается, с любыми ожидающимися файлами обновлений получают в процессе.
Восстановление происходит таким образом, что только таблицы, которые были в живой базе данных, перезаписываются. Любое обновление, которое добавляет таблицу, поэтому также должна быть нести ответственность за добавление только его, если оно не существует. DROP TABLE IF EXISTS
удобно. К сожалению, не все базы данных поддерживают это, поэтому система обновления также позволяет выполнять сценарии, написанные на нашем языке выбора, а не только SQL.
Все это примерно в 150 строках кода. Это так же легко, как и чтение каталога, сравнивая содержимое в таблицу и выполнение того, что еще не было выполнено, в определенном порядке.
Другие советы
Есть стандартные инструменты для этого во многих рамках: Rails есть что называется Миграция, то, что легко воспроизводит в PHP или на любой подобный язык.