Поиск по сайту:

Как автоматизировать миграцию базы данных MySQL с помощью Skeema


Skeema — это инструмент командной строки с открытым исходным кодом, который позволяет синхронизировать схемы базы данных MySQL на нескольких хостах. Он работает с простыми файлами SQL, содержащими операторы CREATE TABLE.

Миграция базы данных — одна из наиболее распространенных проблем в процессе разработки программного обеспечения. Как вы версионируете свою схему и применяете изменения ко всем своим средам?

Skeema помогает решить эту проблему, позволяя вам управлять своей схемой как обычным SQL. Нет специального синтаксиса или формата файла конфигурации для изучения. Когда вы отправляете свою схему на хост, Skeema извлечет определения таблиц на этом хосте и сравнит их с вашими локальными файлами. Затем он вычислит операторы CREATE, ALTER и DROP, чтобы удаленный хост соответствовал вашим файлам SQL.

Вам нужно будет использовать таблицы InnoDB, чтобы получить максимальную отдачу от Skeema. Он может работать с таблицами MyISAM, но поддерживаются не все функции, и вы можете столкнуться с проблемами.

Начиная

Skema доступна для Linux и Mac. Предлагаются пакеты DEB и RPM, а также готовые автономные двоичные файлы. Возьмите соответствующую загрузку для вашей системы и либо установите пакет, либо извлеките двоичный файл в каталог, который находится на вашем пути.

Первым этапом использования Skeema является получение существующей схемы вашей базы данных. Если у вас уже есть коллекция файлов SQL с инструкциями CREATE TABLE, вы можете использовать их как есть. В противном случае запустите команду skeema init, чтобы получить SQL-код, представляющий действующую базу данных.

Интерфейс командной строки Skeema принимает те же аргументы, что и обычная команда mysql. Используйте флаги -h, -u и -p, чтобы указать хост MySQL, имя пользователя и пароль. Пользователь MySQL должен иметь административный доступ к вашим схемам; в противном случае Skeema не сможет проверить их или применить все изменения. Skeema поместит ваши файлы SQL в новый каталог в вашем рабочем каталоге; добавьте флаг -d, чтобы выбрать, как это называется.

skeema init -h example.com -u root -p -d my-sql

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

Синхронизация схем

Получив свой SQL, вы готовы синхронизировать его с другим хостом. Используйте команду skeema push, чтобы сравнить ваш локальный SQL с другим сервером MySQL. Skeema автоматически применит любые обнаруженные изменения.

cd my-sql
skeema push -h example.com -u root -p -d my-sql

Попробуйте изменить один из операторов CREATE TABLE в вашем SQL. Добавьте новый столбец или измените тип существующего. Когда вы skeema push, Skeema сгенерирует оператор ALTER TABLE, который обновит удаленную таблицу для соответствия.

Потенциально разрушительные операции, такие как удаление таблицы или изменение типа данных столбца, по умолчанию отключены. Это поможет вам избежать непреднамеренной потери данных, если вы случайно запустите Skeema или укажете неверный сервер. Деструктивные операции активируются добавлением флага --allow-unsafe к командам skeema push.

Использование нескольких сред

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

Отредактируйте файл .skeema в каталоге схемы, чтобы включить эту функцию. Это INI-подобная структура конфигурации, в которой каждый раздел определяет новую именованную среду. Для начала у вас будет единая среда production, добавленная с помощью skeema init.

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

default-character-set=utf8mb4
default-collation=utf8mb4_general_ci
generator=skeema:1.5.2-community
schema=example-db

[production]
flavor=mysql:8.0
host=example.com
port=3306
password=example
user=mysql

[local]
flavor=mysql:8.0
host=localhost
port=3306
password=example
user=mysql

Теперь вы можете легко синхронизировать изменения между средами:

skeema pull local
skeema push production

Эта последовательность команд сначала обновляет ваши файлы SQL на диске, чтобы они соответствовали схеме вашего local сервера. Затем изменения применяются к рабочей среде production. В качестве альтернативы вы можете вручную отредактировать SQL на диске, а затем отправить как в local, так и в production.

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

Сухие пробеги и ворсинки

Иногда вы можете захотеть проверить изменения, необходимые для среды, не применяя их на самом деле. В этом случае используйте skeema diff, чтобы сравнить именованную среду с вашими файлами SQL на диске. Skeema покажет вам различия, чтобы вы могли предвидеть последствия skeema push.

Skeema также имеет встроенный инструмент для линтинга. Запустите skeema lint, чтобы проанализировать файлы SQL и найти возможные проблемы. Поддерживается несколько настраиваемых правил. Это поможет вам убедиться, что ваш SQL непротиворечив, поддерживается и совместим с современными рекомендациями MySQL. Результаты lint также отображаются во время выполнения команд skeema push и skeema pull.

Больше вариантов

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

  • ignore-table — укажите список имен таблиц, которые следует исключить из синхронизации. Эти таблицы не будут переданы на удаленный хост или извлечены из него. Флаг поддерживает синтаксис регулярных выражений.
  • ignore-trigger — ignore-table, но применяется к триггерам.
  • temp-schema — имя временной схемы, создаваемой на хосте базы данных. Эта база данных используется Skeema в качестве плацдарма для промежуточных изменений во время операций push/pull. Он автоматически удаляется после завершения операции.
  • workspace — определяет, где создается временная схема. По умолчанию используется удаленный хост, но в качестве альтернативного значения поддерживается docker. Это создаст новый контейнер MySQL Docker на вашем локальном компьютере для каждой операции Skeema. Это будет работать, только если у вас установлен Docker.
  • connect-options – разделенный запятыми список параметров MySQL, которые необходимо установить для подключения к удаленной базе данных, например sql_mode=ALLOW_INVALID_DATES,innodb_lock_wait_timeout=1.

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

Заключение

Skeema упрощает миграцию баз данных, обеспечивая автоматизацию и совместимость с конвейерами развертывания CI/CD. Он включает в себя встроенный линтер SQL, инструмент сравнения и механизм синхронизации.

Премиум-версия добавляет дополнительные функции, включая возможность работы с представлениями и триггерами. Skeema Premium — это коммерческое предложение, созданное на базе ядра сообщества Skeema с открытым исходным кодом. Он продается по цене 99 долларов в месяц, а также поддерживает системы Windows.

Принятие Skeema упрощает обмен изменениями схемы базы данных с вашей командой, обеспечивая синхронизацию всех ваших сред. Это более безопасный выбор, чем совместное использование операторов ALTER TABLE вручную, которые могут оказаться неуместными и не создают канонического представления вашей текущей схемы.