Liquibase — Bir Satırı Düzelttim, Uygulama Neden Açılmadı?
Ö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.
-
Bayt: Dünkü changeset'te bakiye sütununu küçük tanımlamışız. Hemen düzelteyim, aynı dosyada!
-
Sen: Test ortamı sıfırdan kurulduğu için sorun yok. Ama production açılmıyor.
-
Bayt: Sadece bir sayıyı değiştirdim! Liquibase neden bu kadar kızdı?
-
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.
Liquibase hangi changeset'lerin çalıştığını nereden bilir?
Bir changeset'in kimliği nelerden oluşur?
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.
Adım adım oku
- Her satır yazılınca mühürlenir.
- Eski bir satır silinip yeniden yazıldı.
- Denetçi: mühür tutmuyor, dur.
- 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.
Production'da çalışmış changeset 2'yi düzenleyip yayına aldın. Açılışta ne olur?
Production'da çalışmış bir changeset'teki hatayı düzeltmenin doğru yolu?
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.
Uygulama açılırken Liquibase kilidi alamıyor ve bekliyor; başka hiçbir pod çalışmıyor. Neden?
Kendin gör
Uygulama açılıyor, Liquibase çalışıyor
Tohum 657166- · kilit
- · checksum doğrulama
- · bekleyenleri uygula
- · kilidi bırak
DATABASECHANGELOG: changeset 1, 2, 3
· açılıyor…
Ş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.
- Varsayılanla oynat. Changeset 2 düzenlendi: kilit alındı, doğrulama başarısız, uygulama açılmadı.
- Değişikliği “yeni changeset 4” yap. Doğrulama geçti, changeset 4 uygulandı, uygulama açıldı.
- “Önceki deploy kilitte öldü”yü aç. Uygulama ilk adımda takıldı. Sonra “release-locks”u aç: açıldı.
Simülatörde "yeni changeset 4" seçilince neden uygulama açıldı?
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.
Changelog dosyalarını yeni bir klasöre taşıdın. Production'da ne olabilir?
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
Kendini sına
Liquibase uygulanmış bir changeset'i her açılışta yeniden çalıştırır.
Ölü kilidi release-locks ile bırakmadan önce ne yapmalı?
Aklında kalacak üç şey
- 1 Liquibase uyguladığı her changeset'in checksum'ını saklar. Uygulanmış bir changeset'i düzenlemek checksum'ı değiştirir ve uygulama açılmaz.
- 2 Changelog yalnızca sonuna eklenen bir defterdir: değişiklik, eskiyi düzenleyerek değil, yeni bir changeset ekleyerek yapılır.
- 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.
4 kart sonraki derste seni bekliyor