Введение
Liquibase — это open-source решение для управления схемами и миграциями баз данных, которое позволяет разработчикам и инженерам данных:
Отслеживать изменения структуры базы данных
Применять миграции последовательно и безопасно
Контролировать версионность базы данных
Работать с различными СУБД единообразно
Ключевые преимущества для Data Engineer:
-
Версионность и контроль изменений:
Каждое изменение схемы базы данных документируется и отслеживается.
Возможность отката к предыдущим версиям структуры базы данных.
Полная история изменений в едином формате.
-
Кроссплатформенность:
Поддержка множества систем управления базами данных: PostgreSQL, MySQL, Oracle, SQL Server и других.
Единый подход к миграциям независимо от выбранной СУБД.
-
Безопасность и согласованность:
Автоматическая проверка применимости миграций.
Механизмы блокировки от параллельного применения конфликтующих изменений.
Встроенные транзакционные механизмы защиты целостности данных.
-
Интеграция с CI/CD:
Легкая интеграция в pipeline непрерывной разработки.
Автоматизация процессов развертывания базы данных.
Поддержка различных форматов описания миграций:
.xml
,.yaml
,.json
,.sql
-
Гибкость и расширяемость:
Поддержка сложных сценариев миграции.
Возможность написания собственных расширений.
Поддержка контекстов и метаданных для миграций.
Что такое Infrastructure as Code (IaC)?
Infrastructure as Code (IaC) — это метод управления и настройки инфраструктуры с использованием кода вместо ручной конфигурации. Применяя IaC, разработчики описывают инфраструктуру (например, серверы, сети, хранилища) в виде файлов конфигурации, что делает процесс более предсказуемым, масштабируемым и автоматизируемым.
Преимущества IaC:
Автоматизация: уменьшение ручного труда.
Воспроизводимость: точная инфраструктура может быть воссоздана с минимальными усилиями
Консистентность: инфраструктура всегда разворачивается одинаково.
Версионирование: изменения отслеживаются в системах контроля версий, таких как Git.
Масштабируемость: легко развернуть инфраструктуру в разных окружениях.
Что такое Liquibase?
Liquibase – это открытая библиотека для отслеживания, управления и применения изменений схемы базы данных. По сути, это реализация принципов Infrastructure as Code для баз данных, которая позволяет:
Версионировать схемы баз данных.
Автоматизировать миграции.
Согласованно управлять структурой БД.
Поддерживать откаты изменений.
Работать независимо от типа базы данных.
Основные особенности Liquibase:
Поддержка различных форматов: изменения можно описывать с помощью
.xml
,.yaml
,.json
или.sql
.Реализация в стиле IaC: как и IaC управляет инфраструктурой, Liquibase управляет схемами баз данных.
Автоматизация миграций: интеграция с CI/CD пайплайнами.
Поддержка Rollback: возможность откатывать изменения базы данных.
Liquibase как DataBase as Code (DBaC)
Liquibase — это по сути реализация принципов IaC, но для баз данных, что делает его ключевым инструментом для DataBase as Code (DBaC). Как IaC управляет инфраструктурой, так Liquibase управляет схемами баз данных, обеспечивая автоматизацию, консистентность и версионирование изменений.
Основные концепции:
Changelog: Главный файл, описывающий все изменения базы данных
Changeset: Атомарный блок изменений
Миграции: Последовательные изменения структуры базы данных
Откаты: Возможность отменить незавершенные или проблемные изменения
Развертывание инфраструктуры для Liquibase
Весь код как всегда будет доступен в моём репозитории.
Все примеры я буду демонстрировать на PostgreSQL, поэтому развернём его:
version: '3.8'
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports:
- "5432:5432"
liquibase:
image: liquibase:4.30.0
depends_on:
- postgres
volumes:
- ./test_project:/liquibase/changelog
working_dir: /liquibase/changelog
command:
- --changeLogFile=changelog.sql
- --url=jdbc:postgresql://postgres:5432/postgres
- --username=postgres
- --password=postgres
- update
После этого мы можем подключиться к нашей БД и увидеть, что в ней ничего нет.
Первая миграция
Давайте создадим нашу первую миграцию. Для этого нам понадобится создать отдельную директорию (для удобства) и я её назвал test_project
.
В нём уже мы можем создать два основных файла, на основании которых будет работать liquibase:
liquibase.properties – в нём мы укажем все параметры для подключения и работы с changelog
driver= org.postgresql.Driver
changelogFile= changelog.sql
# localhost
url= jdbc:postgresql://localhost:5432/postgres
# docker
#url= jdbc:postgresql://postgres:54432/postgres
username= postgres
password= postgres
Важно: здесь стоит обратить внимание на то, что с liquibase можно работать через Docker или через CLI. Поэтому мы имеем два разных url
для подключения к БД.
Важно: Во всех дальнейших примерах я буду использовать CLI (Liquibase Version: 4.28.0)
changelog – файл, который хранит все изменения в нашей БД.
--liquibase formatted sql
--changeset user:create_table
CREATE TABLE test_table
(
test_id INT NOT NULL,
test_column INT,
PRIMARY KEY (test_id)
)
И после заполнения первой таблицы мы можем выполнить её миграцию: liquibase update
.
Важно: changelog можно вести в разных форматах: .sql
, .xml
, .yaml
, .json
. Каждый из них имеет свои плюсы и минусы.
Изменение таблицы
Давайте теперь к тестовой таблице добавим ещё одну колонку. Для этого предлагаю создать файл add_column.sql
:
--liquibase formatted sql
--changeset user:add_column
ALTER TABLE test_table
ADD COLUMN department VARCHAR(255);
Важно: Ранее я указал на то, что у нас есть основной changelog
файл, который прописывается в liquibase.properties
, но это можно изменить в CLI.
Для того, чтобы совершить нашу вторую миграцию необходимо выполнить команду: liquibase --changeLogFile=add_column.sql update
.
Важно: при работе через CLI мы можем менять все атрибуты из liquibase.properties
.
И после выполнения команды выше у нас теперь есть новая колонка:
test_id |
test_column |
department |
---|---|---|
Rollback
Также liquibase позволяет проводить откаты миграций. Все rollback вы можете узнать по ссылке.
Для того чтобы rollback сработал необходимо сразу прописать rollback-команду в .sql
, поэтому давайте изменим нашу последнюю миграцию add_column.sql
:
--liquibase formatted sql
--changeset user:add_column
ALTER TABLE test_table
ADD COLUMN department VARCHAR(255);
--rollback ALTER TABLE test_table DROP COLUMN department;
И теперь если выполнить команду:
liquibase rollback-to-date --date=YYYY-MM-DD --changelog-file=add_column.sql
ты мы получим откат и колонка из таблицы удалится:
test_id |
test_column |
---|---|
Заключение
Liquibase предоставляет мощный инструментарий для управления схемами баз данных, позволяя дата-инженерам работать более эффективно и последовательно. Используя принципы Infrastructure as Code, вы можете:
Автоматизировать миграции.
Контролировать версионность схем.
Минимизировать ручные ошибки.
Обеспечивать согласованность между средами.
Для дата-инженера освоение Liquibase — это инвестиция в эффективность, безопасность и масштабируемость data-инфраструктуры.
Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.