Мне пришлось решить такую проблему для ряда различных сред. Вот некоторые из техник, которые я использовал; какая-то комбинация может решить вашу проблему или, по крайней мере, дать вам правильное представление о ее решении.
Управление версиями данных приложения во время разработки
Я работал над приложением базы данных, которое должно было иметь возможность доставлять определенные данные как часть приложения. Когда мы поставили новую версию приложения, схема базы данных, вероятно, эволюционировала, поэтому нам потребовались сценарии SQL, которые либо (1) создавали бы все таблицы приложения с нуля, либо (2) обновляли все существующие таблицы для соответствия новая схема, добавить новые таблицы и удалить ненужные таблицы. Кроме того, нам нужно было доказать, что сценарии обновления будут работать независимо от того, какая версия приложения обновляется (у нас не было контроля над средой развертывания или расписаниями обновления, поэтому было возможно, что конкретному сайту может потребоваться обновить с 1.1 до 1.3, пропуская 1.2).
В данном случае я использовал инструмент, который выводил бы базу данных в виде одного большого сценария SQL, содержащего все определения таблиц и данные. Затем я написал инструмент, который разделил этот огромный скрипт на отдельные файлы (фрагменты) для каждой таблицы, хранимой процедуры, функции и т. Д. Я написал другой инструмент, который бы брал все фрагменты и создавал один SQL-скрипт. Наконец, я написал третий инструмент, который использовался во время установки, который определял, какие сценарии следует запускать во время установки, основываясь на состоянии базы данных и установленного приложения. Как только я был доволен инструментами, я запустил их для текущей базы данных, а затем отредактировал фрагменты, чтобы исключить посторонние данные, оставив только те части, которые мы хотели отправить. Затем я контролировал версии фрагментов вместе с набором дампов баз данных, представляющих базы данных из поля.
Мой регрессионный тест для базы данных включал бы восстановление дампа базы данных, запуск программы установки для обновления базы данных, создание дампа результата и разбиение дампа на фрагменты, а затем сравнение фрагментов с подтвержденной версией. Если были какие-либо различия, то это указывало на проблемы во фрагментах обновления или установки.
Во время разработки разработчики запускали инструмент установки, чтобы инициализировать (действительно обновить) свои базы данных разработки, а затем вносить свои изменения. Они запускали утилиту dump / split и фиксировали измененные фрагменты вместе со сценарием обновления, который обновлял бы любые существующие таблицы в соответствии с новой схемой. Сервер непрерывной интеграции будет проверять изменения, собирать все и запускать все модульные тесты (включая мои регрессионные тесты базы данных), а затем указывать пальцем на любого разработчика, который забыл зафиксировать все свои изменения базы данных (или соответствующий сценарий обновления). ).
Перенос данных в реальном времени на тестовый сайт
Я создаю веб-сайты, используя Wordpress (на PHP и MySQL), и мне нужно поддерживать «живые» и «тестовые» версии каждого сайта. В частности, мне часто нужно перенести все данные из «живого» в «тестовый», чтобы я мог видеть, как определенные изменения будут выглядеть с живыми данными. Данные в этом случае - это веб-страницы, загруженные изображения и метаданные изображения, а метаданные изображения хранятся в MySQL. Каждый сайт имеет полностью независимые файлы и базы данных.
Подход, который я разработал, представляет собой набор скриптов, которые делают следующее:
- Извлечь два набора (исходный и целевой) учетных данных базы данных и расположений файлов из данных конфигурации.
- Загрузите файлы для исходного сайта.
- Сотрите область файла для целевого сайта.
- Распакуйте файлы в целевую файловую область.
- Создать дамп таблиц для исходной базы данных в файл.
- Удалить все данные из соответствующих таблиц в целевой базе данных.
- Загрузить данные таблицы из файла дампа.
- Выполнение SQL-запросов для исправления любых исходных имен файлов, соответствующих целевой области файла.
Одни и те же сценарии могут использоваться в двух направлениях, чтобы их можно было использовать для извлечения данных для тестирования из живого или pushсайт переходит с тестового на живое.