Вы когда-нибудь случайно удаляли таблицу или столбец из производственной базы данных и задавались вопросом, как бы вы отменили изменения? Можете себе представить, как тяжело может быть на вашей стороне 😃. Это может быть одним из самых страшных моментов для администратора базы данных или даже для разработчика программного обеспечения, которому приходится решать эту задачу. Если это когда-нибудь произойдет, не волнуйтесь, здесь Liquibase приходит на помощь с функцией поддержки отката.
Что такое Liquibase?
Liquibase — это решение для управления изменениями схемы базы данных с открытым исходным кодом , которое позволяет вам легко управлять версиями изменений вашей базы данных.
Но как это работает?
Liquibase использует наборы изменений для представления одного изменения в вашей базе данных.
ChangeSet — это то, что вы используете для группировки баз данных, и это единица изменения, которую Liquibase выполняет в базе данных .
ChangeLog — это список изменений, созданных несколькими наборами изменений.
Но как Liquibase идентифицирует набор изменений? ChangeSet идентифицируется тремя элементами: «ID» и «автор» и путем к имени файла ChangeLog .
Liquibase позволяет выполнять следующие действия:
- Поддержка отката: вы можете использовать откат liquibase.bat для отмены обновления, поскольку он позволяет откатить наборы изменений на основе количества наборов изменений , до заданной даты или до заданного тега, хранящегося в базе данных. Откат изменений для определенных версий без нужно знать, что уже было развернуто.
- Автоматические обновления : вместо того, чтобы выполнять обновления или откаты непосредственно для базы данных, вы можете сгенерировать SQL, который будет запускаться для проверки и/или выполнения вручную.
- Будущие выходные данные отката : прежде чем применить обновление к базе данных, вы можете сгенерировать SQL-запрос, который вам потребуется выполнить, чтобы вернуть базу данных в состояние, в котором она находится сейчас, для проверки.
- Контексты ChangeSet : ChangeSets могут быть назначены «контексты», в которых они будут запускаться. Контексты выбираются во время выполнения и могут использоваться для создания наборов изменений, которые запускаются только в тестовых экземплярах или в других уникальных обстоятельствах.
- Предварительные условия ChangeLog и ChangeSet : предварительные условия могут быть добавлены в журнал изменений или отдельные наборы изменений для проверки состояния базы данных перед попыткой их выполнения.
- Контрольные суммы ChangeSet : при выполнении changeSet Liquibase сохраняет контрольную сумму и может завершиться ошибкой или изменить выполнение, если обнаружит разницу между исходным определением changeSet при его запуске и текущим определением.
- Поддержка различий: хотя Liquibase создан для использования сравнения баз данных для управления изменениями, в Liquibase есть поддержка для этого, что полезно во многих случаях, например, при выполнении проверок работоспособности между базами данных.
Вы также можете использовать Liquibase с существующей базой данных, для начала поищите это здесь . Также ознакомьтесь с дополнительными советами LiquiBase от Baeldung .
Чтобы настроить Liquibase , перейдите по следующей ссылке из официальной документации.
Блок-схема операции Liquibase.
Liquibase определяет тип базы данных и различные наборы изменений, из которых она подготавливает оператор SQL из журналов изменений базы данных .
Когда вы запускаете Liquibase в первый раз, он создает DataBaseChangeLog , DataBaseChangeLock для отслеживания изменений БД и выполнения SQL-запросов к целевым базам данных .
Когда вы запускаете команду обновления Liquibase, Liquibase просматривает файл журнала изменений , чтобы увидеть, есть ли какие -либо наборы изменений , которые не были обновлены в DataBaseChangeLog. Если они найдены, он выполняет их и помещает обновленную запись в таблицу, предоставляя вам последнюю версию определяемой вами структуры.
Вместо того, чтобы писать SQL непосредственно для базы данных для создания, обновления или удаления объектов базы данных, желаемые изменения базы данных могут быть записаны в другом формате, таком как XML, SQL, YAML, JSON .
Пример набора изменений в формате YAML
- changeSet:
id: 1
автор: josephine
changes:
- addColumn:
tableName: person
columns:
- column:
name: username
type: varchar(10)
Примеры ChangeSet в формате XML
<changeSet id="1" author=" josephine ">
<addColumn tableName=" person ">
<column name=" username " type=" varchar(10) "/>
</addColumn>
</changeSet>
Оформить заказ с использованием форматов SQL и JSON по этой ссылке ниже
Пример использования Liquibase
В этом примере я собираюсь продемонстрировать, как использовать функцию отката Liquibase для отмены операции с базой данных Liquibase и отката (возврата) к тегу предыдущей версии базы данных, например версии 1.0. (Также Liquibase может откатиться без тегов).
Чтобы запустить liquibase с помощью maven , вам нужно:
Добавьте liquibase-maven-plugin в файл pom,
Чтобы запустить liquibase с помощью Gradle , вам нужно:
Добавьте liquibase-gradle-plugin в файл build.gradle,
Чтобы запустить liquibase в командной строке
- скачать liquibase, распаковать его исполняемый файл liquibase или liquibase.bat в пакете. - загрузите драйвер jdbc базы данных на локальный диск.
Вы можете выбрать либо командную строку, либо плагин gradle, либо плагин maven для запуска liquibase, в зависимости от того, что вам подходит.
Категории операций Liquibase
- Автоматический откат . Миграция базы данных может автоматически генерировать шаги, необходимые для отката. К таким типам изменений относятся
create table
,rename column
, иadd column.
- Ручной откат: команда отката размещается вручную, поскольку инструкции по автоматическому переносу нельзя использовать для идентификации оператора. Такие типы изменений включают
drop table
иinsert data.
Для этих случаев вы можете указать команды отката с помощью тега внутри тега набора изменений . Вы можете использовать пустой тег, если не хотите, чтобы было сделано что-либо для отмены изменения в режиме отката.
Образцы
Например, изображение ниже представляет текущую версию базы данных, скажем, 1.1, где я переименовал столбец «Студент» в « students_name », и теперь я хотел бы вернуть измененное имя столбца к предыдущей версии 1.0, где я пометил его как имя .
Вы можете указать откат изменений тремя способами:
1. Тег
Это влечет за собой указание тега для отката, который вернет все наборы изменений, которые были выполнены в целевой базе данных после применения данного тега. Вот пример использования команды Maven :
mvn liquibase: откат -Dliquibase.rollbackTag = 1.0
2. Количество наборов изменений
Вы также можете выполнить откат, указав количество наборов изменений, которые необходимо откатить.
Вот пример использования команды Maven :
mvn liquibase: откат -Dliquibase.rollbackCount = 1
3. Дата
Дата отката может быть указана таким образом, чтобы наборы изменений, выполненные после этого дня, были отброшены.
Вот пример использования команды Maven :
mvn liquibase: rollback "-Dliquibase.rollbackDate = 10 августа 2020 г."
Использование оператора отката в наборах изменений.
Ниже приведены примеры того, как мы можем использовать операторы отката в наборах изменений:
1. Несколько тегов отката
В наборе изменений может быть более одного тега отката , однако они выполняются в том порядке, в котором они появляются в наборе изменений :
<changeSet id=”multipleRollbackTags” author="josephine">
<createTable tableName=”person">
<column name=”id” type=”int”/>
<column name=”username” type=”varchar(30)”/>
</createTable>
<createTable tableName=”occupation">
<column name=”id” type=”int”/>
<column name=”career_path” type=”varchar(30)”/>
</createTable>
<rollback>
<dropTable tableName=”person">
</rollback>
<rollback>
<dropTable tableName=”occupation">
</rollback>
</changeSet>
2. Многократный откат
Один тег отката может содержать несколько операторов, которые должны быть выполнены, когда мы удаляем две таблицы в одном и том же теге отката.
<changeSet id="multiStatementRollback" author="josephine">
<createTable tableName=”person">
<column name=”id” type=”int”/>
<column name=”username” type=”varchar(30)”/>
</createTable>
<createTable tableName=”occupation">
<column name=”id” type=”int”/>
<column name=”career_path” type=”varchar(30)”/>
</createTable>
<rollback>
<dropTable tableName="person"/>
<dropTable tableName="occupation"/>
</rollback>
</changeSet>
3. Рефералы ChangeSet для отката
Мы можем обратиться к другому набору изменений, возможно, к исходному набору изменений, если мы собираемся изменить некоторые детали в базе данных. Это уменьшит дублирование кода и сможет правильно отменить сделанные изменения:
<changeSet id=”referChangeSetForRollback” author="josephine">
<dropTable tableName=”person"/>
<dropTable tableName=”occupation"/>
<rollback changeSetId=”multiStatementRollback” changeSetAuthor="josephine"/>
</changeSet>
4. Пустой тег отката
По умолчанию Liquibase пытается сгенерировать сценарий отката, если мы его не предоставили. Если нам нужно сломать эту функцию, мы можем иметь пустой тег отката, чтобы операция отката не отменялась:
<changeSet id=”emptyRollback” author=”josephine”>
<createTable tableName=”occupation”>
<column name=”id” type=”int”/>
<column name=”career_path” type=”varchar(30)”/>
<column name=”author” type=”varchar(30)”/>
</createTable>
<rollback/>
</changeSet>
NB: мы также можем использовать rollbackOneChangeSet
команду, которая отменяет один непоследовательный набор изменений , сделанный во время предыдущего изменения вашей базы данных, который доступен только для пользователей Liquibase Pro .