Liquibase Migration Guide: Datenbankmigrationen ohne Risiko

Liquibase Migration Guide: Datenbankmigrationen ohne Risiko
https://www.liquibase.org/get-started/core-usage/database-migration
von Zelkulon10. März 20251 min Lesezeit

Liquibase macht Datenbankmigrationen reproduzierbar, versioniert und sicher. Dieser Guide zeigt den kompletten Workflow von der ersten Migration bis zum Rollback.

Das Problem ohne Liquibase

Das Problem ohne Liquibase

Changelog-Struktur

src/main/resources/db/changelog/
├── db.changelog-master.yaml     ← Master (importiert alle anderen)
├── 2024/
│   ├── 001-create-users-table.yaml
│   ├── 002-add-email-index.yaml
│   └── 003-create-orders-table.yaml
└── 2025/
    ├── 001-add-last-login-column.yaml
    └── 002-create-audit-log.yaml
# db.changelog-master.yaml
databaseChangeLog:
  - includeAll:
      path: db/changelog/2024/
  - includeAll:
      path: db/changelog/2025/

Changeset: Tabelle erstellen

# 2024/001-create-users-table.yaml
databaseChangeLog:
  - changeSet:
      id: 2024-001-create-users
      author: [email protected]
      changes:
        - createTable:
            tableName: users
            columns:
              - column:
                  name: id
                  type: VARCHAR(36)
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: email
                  type: VARCHAR(255)
                  constraints:
                    nullable: false
                    unique: true
              - column:
                  name: created_at
                  type: TIMESTAMP
                  defaultValueComputed: CURRENT_TIMESTAMP
      rollback:
        - dropTable:
            tableName: users

Komplexere Migration mit Kontext

# 2025/001-add-last-login.yaml
databaseChangeLog:
  - changeSet:
      id: 2025-001-add-last-login
      author: [email protected]
      preConditions:
        onFail: MARK_RAN
        tableExists:
          tableName: users
      changes:
        - addColumn:
            tableName: users
            columns:
              - column:
                  name: last_login_at
                  type: TIMESTAMP

  # Nur in Test/Dev ausführen
  - changeSet:
      id: 2025-002-insert-test-data
      context: "test,development"
      changes:
        - insert:
            tableName: users
            columns:
              - column: { name: email, value: "[email protected]" }

Rollback

# Via Maven Plugin
mvn liquibase:rollback -Dliquibase.rollbackCount=1

# Via CLI
liquibase rollback --tag=v1.0
liquibase rollbackCount 3

Best Practices

  • Changesets sind unveränderlich – bereits ausgeführte niemals ändern
  • Immer Rollback-Anweisungen definieren
  • Kontexte für umgebungsspezifische Migrationen (test, development)
  • Numerisches Präfix (001-, 002-) für sortierte Ausführung
  • In CI/CD: mvn liquibase:validate vor jedem Deployment

Fazit

  • Reproduzierbar: Jede Umgebung ist garantiert auf demselben Stand
  • Versioniert: Vollständige Geschichte aller Schemaänderungen
  • Rollback-fähig: Migrationen können rückgängig gemacht werden
  • CI/CD-ready: Automatische Ausführung bei jedem Deployment
Liquibase Migration Guide: Datenbankmigrationen ohne Risiko