Liquibase

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 05:09, 20 сентября 2018.

Liquibase - независимая от базы данных библиотека для отслеживания, управления и применения изменений схемы базы данных. Библиотека была запущена в 2006 году, чтобы упростить отслеживание изменений в базе данных, особенно в гибкой среде разработки программного обеспечения.

Liquibase
Liquibase Datical.png
Создатели: Натан Воксланд
Разработчики: Datical
Выпущена: 2006; 14 years ago (2006)
Постоянный выпуск: 3.6.2 / 5 July 2018 года; 2 years ago (2018-07-05) [Источник 1]
Состояние разработки: Активно
Написана на: Java
Лицензия: Apache License 2.0
Веб-сайт www.liquibase.org

Общая информация

Все изменения в базе данных хранятся в текстовых файлах (XML, YAML, JSON или SQL) и идентифицируются комбинацией тегов «id» и «author», а также именем самого файла. Список всех примененных изменений хранится в каждой базе данных, с которой проводятся консультации по всем обновлениям базы данных, чтобы определить, какие новые изменения необходимо применять. В результате нет номера версии у базы данных, такой подход позволяет работать в средах с несколькими разработчиками и несколькими ветвями кода.

Основные понятия

Changelog файл

Разработчики сохраняют изменения базы данных в текстовых файлах на своих локальных машинах разработки и применяют их к своим локальным базам данных. Файлы изменений могут быть произвольно вложены для лучшего управления. Корнем всех изменений Liquibase является файл databaseChangeLog.

Change Set

Каждый тег changeSet уникально идентифицируется комбинацией тега id, тега «author» и имени пути к файлу списка изменений. Тег id используется только как идентификатор, он не управляет порядком выполнения изменений и даже не должен быть целым числом. Если вы не знаете или не хотите сохранить фактического автора, просто используйте значение заполнитель, например «UNKNOWN». Поскольку Liquibase выполняет databaseChangeLog, он считывает изменения в порядке и для каждого из них проверяет таблицу «databasechangelog», чтобы увидеть, была ли запущена комбинация id / author / filepath. Если он был запущен, changeSet будет пропущен, если не будет истинного тега «runAlways». После того, как все изменения в changeSet будут запущены, Liquibase вставляет новую строку с id / author / filepath вместе с MD5Sum changeSet в «databasechangelog». Liquibase пытается выполнить каждый changeSet в транзакции, которая выполняется в конце, или откат, если есть ошибка. Некоторые базы данных будут автоматически фиксировать утверждения, которые мешают этой настройке транзакции и могут привести к непредвиденному состоянию базы данных. Поэтому обычно лучше всего иметь одно изменение для changeSet, если нет группы изменений, не связанных с автоматической фиксацией, которые вы хотите применить в качестве транзакции, такой как вставка данных.

Изменения

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

Предварительные условия

Предварительные условия могут быть прикреплены к журналам изменений или наборам изменений для управления выполнением обновления в зависимости от состояния базы данных. Существует несколько причин использовать предварительные условия, в том числе:

  • Документирование того, какие предположения были созданы авторами журнала изменений при его создании.
  • Возможность убедится в том, что эти допущения не нарушены пользователями, выполняющими журнал изменений.
  • Выполнять проверку данных перед выполнением неисправимого изменения, например drop_Table.
  • Контроль за тем, какие изменения запускаются и не запускаются в зависимости от состояния базы данных.

При желании предварительное условие может быть единственным тегом в <changeSet>. Предварительные условия на уровне изменений применяются ко всем наборам изменений, а не только к тем, которые перечислены в текущем списке изменений или его детальных списках изменений.

Контекст

«Контексты» в Liquibase - это теги, которые вы можете добавить в changeSets для управления, которые будут выполняться в любом конкретном прогоне миграции. Любая строка может использоваться для имени контекста, и они проверяются без учета регистра. Когда вы запускаете migrator, хотя любой из доступных методов, вы можете передать набор контекстов для запуска. Будут запущены только команды changeSets, отмеченные переданными контекстами. Если вы не назначаете контекст для changeSet, он будет работать все время независимо от того, какие контексты вы передаете мигратору. Если вы не укажете контекст при запуске migrator, будут запущены все контексты.

Основные функциональные возможности

  • Более 30 встроенных рефакторингов баз данных
  • Расширяемость для создания пользовательских изменений
  • Обновление базы данных до текущей версии
  • Откат последних изменений в базе данных
  • Откат базы данных изменяется на определенную дату / время
  • Откат базы данных до "тега"
  • SQL для обновлений баз данных и откатов можно сохранить для ручного просмотра
  • Автономный IDE и плагин Eclipse
  • «Контексты» для включения / исключения наборов изменений для выполнения
  • Отчет о различиях базы данных
  • Генерация изменений в базе данных
  • Возможность создания журнала изменений для создания существующей базы данных
  • Создание документации по изменениям базы данных
  • Проверка СУБД, проверка пользователя и предварительные условия проверки SQL
  • Возможность разбивать журнал изменений на несколько файлов для упрощения управления
  • Исполняется через командную строку, Apache Ant, Apache Maven, servlet container или Spring Framework
  • Поддержка 10 систем баз данных

Коммерческая версия

Datical является крупнейшим спонсором проекта Liquibase и разработчиком Datical DB - коммерческого продукта, который обеспечивает функциональность Liquibase Core, а также дополнительные функции для устранения сложности, упрощения развертывания и устранения разрыва между разработкой и операциями. Datical DB была создана для управления приложениями для крупных предприятий при переходе от непрерывной интеграции к непрерывной доставке. [Источник 2]

  • Прогнозирование изменений: прогноз предстоящих изменений, которые должны быть выполнены до их запуска, чтобы определить, как эти изменения повлияют на ваши данные.
  • Rules Engine для обеспечения соблюдения корпоративных стандартов и политик.
  • Поддержка базы данных Stored Logic: функции, хранимые процедуры, пакеты, табличные пространства, триггеры, последовательности, пользовательские типы, синонимы и т.д
  • Сравнение баз данных позволяет сравнить две схемы, чтобы определить изменения и легко переместить их в журнал изменений.
  • Мастер изменения настроек позволяет легко определять и записывать изменения базы данных в нейтральном режиме базы данных.
  • Мастер планирования развертывания для моделирования и управления процессом логического развертывания
  • Плагины для Jenkins, Bamboo, UrbanCode, CA Release Automation (Nolio), Serena Release Automation, BMC Bladelogic, Puppet, Chef, а также все популярные системы управления версиями, такие как SVN, Git, TFS, CVS и т. Д. [Источник 3]

Datical DB используется администраторами баз данных, командами DevOps, владельцами приложений, архитекторами и разработчиками, участвующими в процессе выпуска приложений. Он управляет изменениями схемы базы данных вместе с кодом приложения программным способом, который устраняет ошибки и задержки и позволяет быстро выпускать Agile. Datical DB основывается на подходе модели данных Liquibase для управления конкретным контентом структуры данных в версиях приложений по мере продвижения от разработки к тестовой среде. Datical просмотр влияния изменений схемы в любой среде перед развертыванием, таким образом уменьшая риск и приводя к более плавным и быстрым изменениям приложений. Разработчик Liquibase, Натан Воксланд, является исполнительным директором Datical.


Стратегия отделения кода

Liquibase использует стратегию ветвления с использованием следующих долгоживущих ветвей:

  • master. Соответствует следующей версии без исправления
  • "#.#.X". Каждый выпуск без исправления, такой как «3.1», получает ветку для себя и ее исправлений. Например, выпуск 3.1.0 станет началом ветки «3.1.x»

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

Пример стратегии отделения кода в Liquibase.

Используемая ветвь

При работе с ошибкой или функцией код должен основываться на ветке, соответствующей самому дальнему семейству версий, в которое будет включено изменение. Поэтому, если вы согласны с тем, что изменение происходит только в следующем выпуске, откройте «master». Если вы используете версию 3.0.2 и нуждаетесь в изменении предстоящего выпуска исправлений 3.0, откройте «3.1.x».

Пример рабочего процесса

Начальное состояние: есть 3 активных ветви: «мастер», «3.0.x» и «3.1.x». 3.0.3 и 3.1.2 являются последними версиями предыдущих семейств релизов. Поскольку версия 3.1 была выпущена, большая часть развития происходит от «ведущей» ветки. Особенности развиваются в ветвях вилок с «master», и когда они сделаны, запросы создаются и принимаются в «master». Если обнаружена ошибка, которая должна быть исправлена в 3.1, она обрабатывается в ветке 3.1, и когда это делается, запрос создается и принимается в ветку 3.1.x. Когда пользователь будет готов к выпуску 3.1.3, ветка 3.1.x будет помечена как «3.1.3», а затем объединена с «master». Когда пользователь готов выпустить код в «master», а номер версии определяется, например, 3.2, ветвь «3.2.x» создается для окончательного тестирования и помечена как «3.2.0» во время релиза.

Поддерживаемые базы данных

Из-за различий в типах данных и синтаксисе SQL в настоящее время поддерживаются следующие базы данных.

База данных Тип Примечание
MySQL mysql
PostgreSQL postgresql 8.2+ требуется использовать функции "drop all database objects"
Oracle oracle 11g требуется при использовании инструмента diff в базах данных, работающих с AL32UTF8 или AL16UTF16
Sql Server mssql
Sybase_Enterprise sybase Требуется ASE 12.0+. Необходимо выбрать параметр "select into". Лучший драйвер - JTDS. Sybase не поддерживает транзакции для DDL, поэтому откаты не будут работать при сбоях. Внешние ключи не могут быть удалены, что может привести к поломке отката или функции DropAll.
Sybase_Anywhere asany Начиная с 1,9
DB2 db2 При необходимости автоматически вызовет REORG.
Apache_Derby derby
HSQL hsqldb
H2 h2
Informix informix
Firebird firebird
SQLite sqlite

Образец файла Liquibase ChangeLog

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.3"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.3
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.3.xsd">
    <preConditions>
            <dbms type="oracle"/>
    </preConditions>

    <changeSet id="1" author="author1">
        <createTable tableName="persons">
            <column name="id" type="int" autoIncrement="true">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)"/>
        </createTable>
    </changeSet>

    <changeSet id="2" author="author2" context="test">
        <insert tableName="persons">
            <column name="id" value="1"/>
            <column name="name" value="Test1"/>
        </insert>
        <insert tableName="persons">
            <column name="id" value="2"/>
            <column name="name" value="Test2"/>
        </insert>
    </changeSet>
</databaseChangeLog>

Установка LIQUIBASE на CENTOS 7 MySQL

Установить Java

sudo yum install java-1.7.0-openjdk

Получить код Liquibase

$ wget http://sourceforge.net/projects/liquibase/files/Liquibase%20Core/liquibase-3.1.1-bin.tar.gz/download
$ tar zxvf liquibase-3.1.1-bin.tar.gz
$ sudo chmod + x ./liquibase
$ ./liquibase --version

Установить MySQL

$  sudo yum  install mysql mysql-server
$  sudo chkconfig --levels 235 mysqld on
$ sudo service mysqld start
$ /usr/bin/mysqladmin -u root password 'root'
$ mysql -u root -p root

Установите коннектор MySQL для Java

$  wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.30.tar.gz
$  tar zxvf mysql-connector-java-5.1.30.tar.gz

Создать базу данных MySQL

$ mysql -uroot -proot
mysql> create database example;
mysql> exit;

Создать Changelog файл

$ vim ./changelog.xml

Добавьте следующее ...

 <?xml version="1.0" encoding="UTF-8"?>
 <databaseChangeLog  
   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"  
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">  
   <changeSet id="1" author="bob">  
     <createTable tableName="department">  
       <column name="id" type="int">  
         <constraints primaryKey="true" nullable="false"/>  
       </column>  
       <column name="name" type="varchar(50)">  
         <constraints nullable="false"/>  
       </column>  
       <column name="active" type="boolean" defaultValueBoolean="true"/>  
     </createTable>  
   </changeSet>  
 </databaseChangeLog> 

Запуск Liquibase

$ ./liquibase --driver=com.mysql.jdbc.Driver --classpath=mysql-connector-java-5.1.30/mysql-connector-java-5.1.30-bin.jar  --changeLogFile=changelog.xml --url="jdbc:mysql://localhost/example" --username=root --password=root update

Создать liquibase.properties файл

$ vim ~/liquibase.properties

И добавить...

 driver: com.mysql.jdbc.Driver  
 classpath: mysql-connector-java-5.1.30/mysql-connector-java-5.1.30-bin.jar  
 url: jdbc:mysql://localhost/example  
 username: root  
 password: root  

Запустить Liquibase

$ ./liquibase --changeLogFile=changelog.xml update

Видеоинструкция

Часть первая
Часть вторая

Источники

  1. Liquibase Downloads//Официальный сайт Liquibase. Дата обновления: 05.07.2018. URL: http://liquibase.org/download (дата обращения: 17.09.2018).
  2. Datical//Официальный сайт компании Datical. [2012 - 2018] Дата обновления: 09.08.2018. URL: http://www.datical.com (дата обращения: 17.09.2018).
  3. Datical integrations//Официальный сайт компании Datical. [2012—2018]. Дата обновления: 09.08.2018. URL: http://www.datical.com/integrations/ (дата обращения: 17.09.2018).

Ссылки

  • Хабрахабр [Электронный ресурс]: Управление миграциями БД с Liquibase / Дата обращения: 17.09.18. Режим доступа: https://habr.com/post/178665/
  • Официальный сайт Liquibase [Электронный ресурс]: / Дата обращения: 17.09.18. Режим доступа: https://download.liquibase.org/
  • Официальный сайт компании Datical [Электронный ресурс]: / Дата обращения: 17.09.18. Режим доступа: https://www.datical.com/
  • E&Bsoftware.org [Электронный ресурс] : INSTALLING LIQUIBASE ON CENTOS / Дата обращения: 17.09.18. Режим доступа: https://www.eandbsoftware.org/installing-liquibase-on-centos/
  • GitHub.com [Электронный ресурс]: GitHub: официальный репозитория Liquibase / Дата обращения: 17.09.2018. Режим доступа: https://github.com/liquibase/liquibase