← Назад к вопросам

Откатывал ли изменения с помощью Liquibase

1.0 Junior🔥 81 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Откатывание изменений в Liquibase

Liquibase — это инструмент для управления версионированием и миграцией баз данных. Одна из его ключевых возможностей — безопасное откатывание (rollback) изменений при необходимости.

Основные команды для откатывания

1. Откат одного changeset-а

liquibase rollback --changeset-author=author-name --changeset-id=id

Эта команда отката все изменения одного конкретного changeset-а, указанного по ID и автору.

2. Откат к дате

liquibase rollback-to-date --date=2024-01-15T10:00:00

Отката все changesets, которые были выполнены после указанной даты.

3. Откат N последних changesets

liquibase rollback --count=3

Отката последние 3 изменения в обратном порядке выполнения.

4. Откат к конкретному тегу

liquibase rollback --tag=v1.0.0

Отката все изменения, выполненные после указанного тега.

Использование в production

В production среде откатывание требует дополнительного внимания:

<databaseChangeLog>
    <changeSet id="001-create-products" author="admin">
        <createTable tableName="products">
            <column name="id" type="BIGINT" autoIncrement="true">
                <constraints primaryKey="true" />
            </column>
            <column name="name" type="VARCHAR(255)" />
            <column name="price" type="DECIMAL(10,2)" />
        </createTable>
    </changeSet>
</databaseChangeLog>

Пример changeset-а с rollback стратегией

<databaseChangeLog>
    <changeSet id="1" author="ivan">
        <createTable tableName="users">
            <column name="id" type="UUID" defaultValue="gen_random_uuid()">
                <constraints primaryKey="true" nullable="false" />
            </column>
            <column name="name" type="VARCHAR(255)" />
            <column name="email" type="VARCHAR(255)" />
        </createTable>
        
        <rollback>
            <dropTable tableName="users" />
        </rollback>
    </changeSet>
</databaseChangeLog>

Проблемы при откатывании

1. Данные уже были удалены

Если вы выполнили dropTable и данные были потеряны, откатывание не восстановит данные:

<changeSet id="2" author="ivan">
    <dropTable tableName="archive" />
    <rollback>
        <createTable tableName="archive">
            <column name="id" type="UUID" primaryKey="true" />
        </createTable>
    </rollback>
</changeSet>

2. Невозможно откатить некоторые операции

Некоторые changesets не имеют встроенного откатывания:

<changeSet id="3" author="ivan">
    <sql>
        UPDATE users SET status = 'active';
    </sql>
    <rollback>
        <sql>
            UPDATE users SET status = 'inactive';
        </sql>
    </rollback>
</changeSet>

Лучшие практики

1. Всегда писать rollback блоки

<changeSet id="4" author="ivan">
    <addForeignKeyConstraint
        baseTableName="orders"
        baseColumnNames="user_id"
        referencedTableName="users"
        referencedColumnNames="id"
    />
    <rollback>
        <dropForeignKeyConstraint
            baseTableName="orders"
            constraintName="fk_user_id"
        />
    </rollback>
</changeSet>

2. Тестировать откатывание локально перед production

liquibase update
liquibase rollback --count=1
liquibase update

3. Использовать понятные ID changesets

Хорошо: <changeSet id="20240115-001-create-users" author="ivan"> Плохо: <changeSet id="1" author="ivan">

4. Документировать причины откатывания

Каждый changeset должен содержать комментарий о причине откатывания или особенностях миграции.

История выполнения changesets

Liquibase хранит информацию обо всех changesets в таблице DATABASECHANGELOG:

SELECT * FROM DATABASECHANGELOG ORDER BY DATEEXECUTED DESC;

Эта таблица содержит ID, автора, дату выполнения, статус выполнения.

Когда избежать откатывания

  • Production среда с критичными данными — лучше выполнить миграцию вперёд
  • После синхронизации с бизнесом — откатывание может нарушить договорённости
  • Если данные уже были изменены — откатывание не восстановит исходные значения

Итоговый чеклист

✓ Каждый changeset имеет rollback блок ✓ Откатывание протестировано локально ✓ В production документированы причины откатывания ✓ История changesets отслеживается в DATABASECHANGELOG ✓ Используются понятные ID для changesets

Liquibase откатывание — мощный инструмент, но требует ответственности при работе с production базами данных.