Liquibase Migration Rehberi: Risksiz Veritabanı Göçleri

Liquibase Migration Rehberi: Risksiz Veritabanı Göçleri
https://www.liquibase.org/get-started/core-usage/database-migration
Zelkulon10 Mart 20251 dk okuma

Liquibase, veritabanı göçlerini tekrarlanabilir, versiyonlanmış ve güvenli kılar. Bu rehber, ilk göçten geri almaya kadar tüm iş akışını gösterir.

Liquibase Olmadan Yaşanan Sorun

Liquibase Olmadan Yaşanan Sorun

Changelog Yapısı

src/main/resources/db/changelog/
├── db.changelog-master.yaml     ← Master (diğerlerini içe aktarır)
├── 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: Tablo Oluşturma

# 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

Bağlamla Karmaşık Göç

# 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

  # Yalnızca test/geliştirme ortamında çalıştır
  - changeSet:
      id: 2025-002-insert-test-data
      context: "test,development"
      changes:
        - insert:
            tableName: users
            columns:
              - column: { name: email, value: "[email protected]" }

Geri Alma (Rollback)

# Maven Eklentisi ile
mvn liquibase:rollback -Dliquibase.rollbackCount=1

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

En İyi Uygulamalar

  • Changeset'ler değiştirilemez – halihazırda çalıştırılmışları asla değiştirme
  • Her zaman geri alma talimatlarını tanımla
  • Ortama özgü göçler için bağlamları kullan (test, development)
  • Sıralı çalıştırma için sayısal önek (001-, 002-)
  • CI/CD'de: her dağıtımdan önce mvn liquibase:validate çalıştır

Özet

  • Tekrarlanabilir: Her ortamın aynı durumda olması garantilenir
  • Versiyonlu: Tüm şema değişikliklerinin eksiksiz geçmişi
  • Geri alınabilir: Göçler geri alınabilir
  • CI/CD-hazır: Her dağıtımda otomatik çalıştırma
Liquibase Migration Rehberi: Risksiz Veritabanı Göçleri