İçeriğe geç

Liquibase — Bir Satırı Düzelttim, Uygulama Neden Açılmadı?

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Kesintisiz Şema Değişikliği — Genişlet, Taşı, Daralt

30 saniyede özet

Liquibase her changeset'i bir kez çalıştırır ve checksum'ını kaydeder. Uygulanmış bir changeset'i düzenlemek doğrulamayı kırar; değişiklik yeni bir changeset olur. Öldürülen bir deploy'un bıraktığı kilit ise herkesi bekletir.

Resmî bir defterde her satır yazıldığı gün mühürlenir. Eski bir satırı silip yeniden yazarsan mühür tutmaz. Denetçi defteri açar ve “burada bir şey değişmiş” der.

  1. Bayt: Dünkü changeset'te bakiye sütununu küçük tanımlamışız. Hemen düzelteyim, aynı dosyada!

  2. Sen: Test ortamı sıfırdan kurulduğu için sorun yok. Ama production açılmıyor.

  3. Bayt: Sadece bir sayıyı değiştirdim! Liquibase neden bu kadar kızdı?

  4. Bayt: Production o changeset'i dün çalıştırdı. Liquibase eski hâlini hatırlıyor olabilir mi?

Her changeset bir kez çalışır

Liquibase şema değişikliklerini bir changelogLiquibase'in şema değişikliklerini sırayla tuttuğu dosya. Her değişiklik bir changeset'tir ve bir kez çalışır.Sözlükte gör → dosyasında sırayla tutar. Her değişiklik bir changeset’tir ve kimliği; id, yazar ve dosya yolundan oluşur.

Uygulama açılırken Liquibase hangi changeset’lerin çalıştığına DATABASECHANGELOG tablosundan bakar. Yalnızca çalışmamış olanları sırayla uygular.

Kafam karıştı, daha basit anlat

Liquibase her changeset’i bir kez çalıştırır ve bunu kendi tablosuna yazar.

Hızlı kontrolBaşlangıç

Liquibase hangi changeset'lerin çalıştığını nereden bilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bir changeset'in kimliği nelerden oluşur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Uygulanmış olan değişmez

Liquibase her changeset’i uyguladığında bir checksumBir içerikten hesaplanan kısa özet. İçerik değişirse özet de değişir; Liquibase uygulanmış changeset'lerin değişip değişmediğini böyle anlar.Sözlükte gör → da kaydeder. Sonraki her açılışta dosyadaki changeset’lerin checksum’ını yeniden hesaplayıp karşılaştırır.

Changeset 2 production'da dün çalıştı. Bugün aynı changeset'te sütun boyutunu değiştirdin ve yeni sürümü yayına aldın. Uygulama açılırken ne olur? Cevabı göster

Uygulama açılmaz. Liquibase changeset 2’nin checksum’ının değiştiğini görür ve doğrulamada durur. Değişiklik hiç uygulanmaz; çünkü changeset 2 onun gözünde zaten çalışmıştır.

Eski satıra dokunma, yeni satır ekle.
Adım adım oku
  1. Her satır yazılınca mühürlenir.
  2. Eski bir satır silinip yeniden yazıldı.
  3. Denetçi: mühür tutmuyor, dur.
  4. Eski satıra dokunma, yeni satır ekle.

Doğru yol, değişikliği yeni bir changeset olarak eklemektir: “bakiye sütununu genişlet”. Eski changeset’e dokunulmaz; production ve yeni kurulan ortamlar aynı yolu yürür.

Kafam karıştı, daha basit anlat

Uygulanmış changeset’i düzenleme. Değişikliği yeni bir changeset olarak ekle.

Hızlı kontrolOrta

Production'da çalışmış changeset 2'yi düzenleyip yayına aldın. Açılışta ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Production'da çalışmış bir changeset'teki hatayı düzeltmenin doğru yolu?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kilidi kim tutuyor?

İki uygulama aynı anda migration yapmasın diye Liquibase önce bir changelog kilidiİki uygulamanın aynı anda migration yapmasını önleyen, DATABASECHANGELOGLOCK tablosundaki tek satır. Ölen bir deploy onu bırakmayabilir.Sözlükte gör → alır ve iş bitince bırakır. Kilit, DATABASECHANGELOGLOCK tablosundaki tek bir satırdır.

Migration ortasında öldürülen bir pod kilidi bırakamaz. Sonraki her açılış o kilidi bekler ve bir süre sonra vazgeçer. Kilit release-locks ile bırakılır; ama önce gerçekten çalışan bir migration olmadığından emin olunur.

Kafam karıştı, daha basit anlat

Ölü bir deploy kilidi bırakmayabilir. Kimsenin çalışmadığından emin ol, sonra bırak.

Hızlı kontrolOrta

Uygulama açılırken Liquibase kilidi alamıyor ve bekliyor; başka hiçbir pod çalışmıyor. Neden?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Uygulama açılıyor, Liquibase çalışıyor

Tohum 657166
  1. · kilit
  2. · checksum doğrulama
  3. · bekleyenleri uygula
  4. · kilidi bırak

DATABASECHANGELOG: changeset 1, 2, 3

· açılıyor…

Hız
Adım 0

Şu an ne oldu?

Aşama: lock

Kilit, doğrulama, uygulama, kilidi bırakma.

Görevler0/3

  • Uygulama checksum hatasıyla açılmasınaçık

    İpucu

    Uygulanmış bir changeset'i düzenle.

  • Uygulama ölü bir kilidi beklesinaçık

    İpucu

    Önceki deploy kilitte ölsün.

  • Ölü kilide rağmen uygulama açılsın ve changeset 4 uygulansınaçık

    İpucu

    Kilidi bırak, değişikliği yeni changeset yap.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Changeset 2 düzenlendi: kilit alındı, doğrulama başarısız, uygulama açılmadı.
  2. Değişikliği “yeni changeset 4” yap. Doğrulama geçti, changeset 4 uygulandı, uygulama açıldı.
  3. “Önceki deploy kilitte öldü”yü aç. Uygulama ilk adımda takıldı. Sonra “release-locks”u aç: açıldı.
Hızlı kontrolOrta

Simülatörde "yeni changeset 4" seçilince neden uygulama açıldı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Dosyayı taşımak. Changeset’in kimliğinde dosya yolu da olduğu için, dosyayı taşımak bütün changeset’leri yeni gibi gösterebilir. logicalFilePath ile yolu sabitle.

validCheckSum ile susturmak. Checksum hatasını validCheckSum ile kabul ettirmek mümkündür. Bunu yalnızca değişikliğin veritabanını etkilemediğinden eminsen, örneğin bir yorum düzeltmesinde yap.

Ortamlar arası fark. Test ortamı her seferinde sıfırdan kuruluyorsa, düzenlenmiş changeset orada sorun çıkarmaz. Production’a benzeyen, eski şemadan güncellenen bir ortamda da dene.

Kafam karıştı, daha basit anlat

Yolu sabitle, checksum hatasını susturma, eski şemadan güncellenen bir ortamda dene.

Hızlı kontrolOrta

Changelog dosyalarını yeni bir klasöre taşıdın. Production'da ne olabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aşağıda bir bankanın hesap şeması için changelog’u var: eski changeset’lere dokunulmadan yeni bir changeset eklenmiş.

Derinleş · Hesap şeması: changelog yalnızca sonuna büyür 4 dosya · ~36 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/resources/db/changelog/ db.changelog-master.yaml Ana changelog: dosyaları sırayla içerir; yeni değişiklik yeni bir dosyadır.

src/main/resources/db/changelog/db.changelog-master.yaml
databaseChangeLog:
- include:
file: db/changelog/2026/001-accounts.yaml
- include:
file: db/changelog/2026/002-widen-balance.yaml

src/main/resources/db/changelog/2026/ 001-accounts.yaml Eski changeset: production'da çalıştı, dokunulmaz; logicalFilePath kimliği sabitler.

src/main/resources/db/changelog/2026/001-accounts.yaml
databaseChangeLog:
- logicalFilePath: accounts/001-accounts.yaml # identity survives a file move
- changeSet:
id: 001-create-accounts
author: core-banking
changes:
- createTable:
tableName: account
columns:
- column: { name: id, type: BIGINT, constraints: { primaryKey: true } }
- column: { name: iban, type: VARCHAR(34), constraints: { nullable: false } }
- column: { name: balance, type: DECIMAL(12,2), constraints: { nullable: false } }

src/main/resources/db/changelog/2026/ 002-widen-balance.yaml Yeni changeset: bakiye sütununu genişletir, geri alma adımı da yazılı.

src/main/resources/db/changelog/2026/002-widen-balance.yaml
databaseChangeLog:
- logicalFilePath: accounts/002-widen-balance.yaml
- changeSet:
id: 002-widen-balance
author: core-banking
comment: 001 is already applied in production, so the fix is a new changeset.
changes:
- modifyDataType:
tableName: account
columnName: balance
newDataType: DECIMAL(19,2)
rollback:
- modifyDataType:
tableName: account
columnName: balance
newDataType: DECIMAL(12,2)

src/main/resources/ application.yml application.yml: Spring Boot açılışta Liquibase'i çalıştırır.

src/main/resources/application.yml
spring:
liquibase:
change-log: classpath:db/changelog/db.changelog-master.yaml

Kendini sına

Şimşek turu1/4

Liquibase uygulanmış bir changeset'i her açılışta yeniden çalıştırır.

Soru 1/3İleri

Ölü kilidi release-locks ile bırakmadan önce ne yapmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Liquibase uyguladığı her changeset'in checksum'ını saklar. Uygulanmış bir changeset'i düzenlemek checksum'ı değiştirir ve uygulama açılmaz.
  2. 2 Changelog yalnızca sonuna eklenen bir defterdir: değişiklik, eskiyi düzenleyerek değil, yeni bir changeset ekleyerek yapılır.
  3. 3 Migration ortasında öldürülen bir deploy kilidi bırakmayabilir. Kilidi elle bırakmadan önce gerçekten kimsenin çalışmadığından emin olunur.
Sonraki kapı Gün sonu işi pozisyon tablosunu güncellerken bir müşterinin emri dakikalarca bekledi. Oysa müşterinin satırına kimse dokunmuyordu. Neden? SQL Server'da Kilit Yükseltme — Gün Sonu İşi Neden Müşteriyi Bekletti? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı