Veritabanı migration, şema ve veri yapisindaki degisiklikleri versiyonlanmis script'lerle uygulama pratigidir. Kontrolsuz migration production'da kilitlenme, veri kaybi ve geri donusu imkansiz durumlar üretir. Flyway, Liquibase, EF Core Migrations veya Sqitch farklı araclar ayni disiplini hedefler: tek yonlu, tekrarlanabilir, gozden gecirilmis değişiklik. Bu yazida migration tasarımı, expand-contract, CI entegrasyonu ve production güvenliği incelenir.
Migration kulturu
Her şema degisikligi kod review'den gecer. Migration dosyasi uygulama degisikligi ile ayni pull request'te olmalidir. Manuel SQL production'da calistirilmaz; pipeline uygular. Migration gecmisi audit trail'dir.
Forward-only vs rollback
Rollback script her zaman mümkün degildir; veri dönüşümü geri alinamaz olabilir. Forward-only kulturde geri alma yeni migration ile yapilir. Down migration geliştirme ortaminda test edilir.
Expand-contract pattern
- Expand: Yeni kolon/tablo ekle; geriye uyumlu.
- Dual write: Uygulama hem eski hem yeni yapıya yazar.
- Backfill: Batch job eski veriyi donusturur.
- Switch: Okuma yeni yapıya kayar.
- Contract: Eski kolon/tablo kaldirilir.
Bu pattern zero-downtime deploy ile uyumludur.
EF Core migration pratikleri
dotnet ef migrations add AddOrderStatusIndex
dotnet ef database update --connection "$CONN"
Model snapshot tutarlılığı korunmalidir. Büyük migration'lar bolunmeli: once şema, sonra indeks, sonra veri. HasData seed migration'dan ayri tutulur.
Lock ve sure yönetimi
ALTER TABLE ACCESS EXCLUSIVE lock yazar. PostgreSQL ADD COLUMN nullable hızlıdır. SQL Server ONLINE index ve schema change secenekleri kullanılır. Migration suresi olculur; esik asimi onay gerektirir.
CI pipeline entegrasyonu
PR'da migration bos DB ve snapshot'a uygulanir. Başarısız migration merge engellenir. Staging deploy migration'i production oncesi son test sağlar.
Veri migration
Milyon satir update tek transaction'da lock üretir. Chunked update ve key range tercih edilir. Veri migration tamamlanmadan kod switch yapilmaz.
Semantik versioning
Migration adlari anlamli olmali: 20250725_AddCustomerTierIndex. Timestamp prefix cakismayi onler. Squash eski migration'lari birlestirir; yalnizca greenfield veya major release'te.
Ortam parity
Development, staging ve production ayni motor ve major versiyonda olmali. SQLite geliştirme PostgreSQL production farki migration surprizi üretir. Testcontainers production motoru ile test sağlar.
Güvenlik
Migration hesabi DDL yetkisi tasir; uygulama hesabi DML ile sinirli olmalidir. Migration credential CI secret store'da tutulur.
Anti-pattern'ler
- Production'da manuel hotfix şema
- Migration'siz entity degisikligi
- Veri kaybi riski tasiyan DROP COLUMN acelesi
- Test edilmemis down script
Özet
Migration versiyonlanmis, review edilmis ve otomatik uygulanmis olmali. Expand-contract büyük degisikliklerde standart. Ölçüm, CI ve ortam parity production güvenliğini sağlar.
Zero-downtime şema degisikligi kalıplari
Büyük tabloda kolon ekleme: nullable kolon ekle, backfill job çalıştır, NOT NULL ve default uygula (PostgreSQL 11+ optimize edilmis ADD COLUMN). Kolon rename icin yeni kolon + cift yazim + backfill + eski kolon kaldirma expand-contract dongusu kullanılır. Tablo rename yerine view alias veya synonym geçiş donemi sağlar.
Migration test ve CI
Her migration pull request'te bos veritabanına ve production-benzeri hacimli snapshot'a uygulanir. Up ve down (veya forward-only rollback script) test edilir. Migration suresi olculur; esik degeri asan script production onay gerektirir. Idempotent migration (IF NOT EXISTS) tekrar calistirmaya dayaniklidir.
Veri migration vs şema migration
Veri dönüşümü ayri batch job olabilir; tek transaction icinde milyon satir update lock üretir. Chunked update (LIMIT/OFFSET veya key range) tercih edilir. Veri migration tamamlanmadan uygulama yeni semaya gecmemelidir; feature flag ile kod yolu ayrilir.
Rollback ve felaket senaryolari
Forward-only migration kulturu rollback script'i zorunlu kilmaz ancak acil durum proseduru olmalidir. Yedekten restore penceresi ve RPO/RTO hedefleri migration planina yazilir. Başarısız migration'da otomatik alert ve deploy durdurma pipeline'da tanimlanir.