Schema Migration — özü, türleri ve veritabanı şema migrasyon araçları

Yazar: IT Sectr Yayınlanma: 2026-06-15 Okuma süresi: 10 dk

Schema Migration, uygulama geliştirme sırasında veritabanı yapısındaki değişikliklerin sürüm yönetimi sürecidir. Her değişiklik, dev, staging ve production ortamlarına sırayla uygulanan bir betikle açıklanır. JetBrains (2025)'e göre, ekiplerin %78'i şema migrasyon araçlarını kullanırken, %34'ü hâlâ veritabanlarını konsol üzerinden manuel olarak düzenliyor — şema sapmasının ana kaynağı. Migrasyonları otomatikleştirmek insan hatasını ortadan kaldırır ve ortamlar arasında yapısal tutarlılığı garanti eder.

Ana noktalar

  • Schema Migration — betiklerle veritabanı yapısında sürümlü değişiklik.
  • Flyway — basit SQL migrasyon betikleriyle Java/Kotlin için araç.
  • Liquibase — rollback desteğiyle XML/YAML/JSON formatı.
  • Alembic — otomatik üretimle SQLAlchemy için Python aracı.
  • Şema çakışmaları — migrasyon olmadan birden çok geliştirici çalışırken ana sorun.

Schema Migration Nedir

Schema Migration, farklı ortamlara sırayla uygulanan sürümlü dosyalar aracılığıyla veritabanı yapısındaki değişiklikleri yönetme uygulamasıdır. Her dosya bir dizi SQL komutu içerir: tablo oluşturma, sütun ekleme, dizin değiştirme veya kısıtlamaları güncelleme. Migrasyon aracı, uygulanan sürümleri izler ve her değişikliğin tam olarak bir kez yürütülmesini sağlar.

Tablo içeriklerini aktaran Data Migration'ın aksine, Schema Migration yalnızca yapıyı — DDL işlemlerini — yönetir. Bu temel bir farktır: Schema Migration, Data Migration'dan önce çalışır, hedef şemayı oluşturur ve ardından veriler yüklenir. Redgate (2024)'e göre, üretim veritabanlarındaki olayların %62'si, migrasyon betikleri olmadan yapılan manuel şema değişiklikleriyle ilgilidir.

Migrasyon sürümlemesi

Her Schema Migration benzersiz bir tanımlayıcı alır — genellikle bir sürüm (V1, V2) veya zaman damgası. Araç, özel bir tabloda (flyway_schema_history, alembic_version) uygulanan migrasyonların bir listesini saklar. Başlangıçta, listeyi classpath'teki dosyalarla karşılaştırır ve yalnızca yenilerini uygular. Idempotence önemli bir özelliktir: yeniden çalıştırmanın yan etkisi yoktur.

Şema değişikliği türleri

Tipik Schema Migration işlemleri: tablo oluşturma (CREATE TABLE), sütun ekleme (ALTER TABLE ADD COLUMN), tür değiştirme, dizin oluşturma, yabancı anahtar ekleme ve dizileri güncelleme. Daha karmaşık migrasyonlar, verileri koruyarak sütunları yeniden adlandırmayı, bir tabloyu birden çok parçaya bölmeyi ve bir şemayı parçalar arasında çoğaltmayı içerir.

Veritabanı Şema Migrasyonu Neden Gereklidir

Schema Migration olmadan, geliştiriciler veritabanını manuel olarak değiştirir — konsolda DDL düzenler, dev ortamında sütunlar ekler ve bunları bellekten staging'e kopyalar. Sonuç: ortamlar arasında şema sapması, dağıtım sırasında değişiklik kaybı ve üretimde bozuk migrasyonlar. Schema Migration üç temel sorunu çözer: tutarlılık, tekrarlanabilirlik ve denetim.

Ortamlar arasında tutarlılık

Veritabanı yapısı kodda açıklandığında, dev, staging ve üretimde aynıdır. Bir geliştirici değişiklik uygulamayı unutamaz — araç, kaçırılan tüm migrasyonları sırayla yürütür. Üretimde bir sütun eksikse ancak kod bunu gerektiriyorsa, uygulama bir hatayla başarısız olur. Otomatik doğrulama bu senaryoyu ortadan kaldırır.

Yeni geliştiriciler için tekrarlanabilirlik

Yeni bir ekip üyesi flyway migrate komutunu çalıştırır ve saniyeler içinde geçerli şemayı alır — üretim dökümü veya manuel DDL sorguları olmadan. Bu, özellikle her hizmetin kendi veritabanına sahip olduğu ve şemanın düzinelerce migrasyondan oluşturulduğu mikro hizmet mimarisinde önemlidir. Tam tekrarlanabilirlik, işe alım süresini günlerden dakikalara indirir.

Değişiklik denetimi

Her Schema Migration, uygulama koduyla birlikte sürüm kontrol sisteminde saklanır. Bir Pull Request açabilir, şema değişikliğinin tam SQL komutlarını görebilir ve kod incelemesi yapabilirsiniz. Bir olay durumunda, en son hangi migrasyonun uygulandığını ve kimin yazdığını belirlemek kolaydır. Git geçmişi, proje boyunca veritabanı değişikliklerinin tam izini sağlar.

Şema Migrasyon Araçları

Farklı diller ve platformlar için düzinelerce Schema Migration aracı mevcuttur. Seçim, teknoloji yığınına, migrasyon tanımlama formatına ve rollback gereksinimlerine bağlıdır. Ana kategorilere ve popüler araçlara göz atalım.

AraçDilFormatRollback
FlywayJava, Kotlin, ScalaSQL, JavaAyrı betiklerle
LiquibaseJava, Groovy, KotlinXML, YAML, JSON, SQLYerleşik rollback
AlembicPythonPython, SQLOtomatik oluşturulan downgrade
Active RecordRubyRuby DSLRevert ile
Entity FrameworkC#C# Fluent APIOtomatik oluşturma

Bir araç nasıl seçilir

Java/Kotlin yığınları için — Flyway en hafif ve öngörülebilir olanıdır. Sık rollback gerektiren projeler için — Liquibase, mimarisinde yerleşik rollback'e sahiptir. Python/Django için — Alembic standart SQLAlchemy aracıdır. DevOps mühendisi olmayan startuplar için — en az yapılandırmaya sahip aracı seçin: Flyway yalnızca bir betik dosyası ve migrate komutu gerektirir.

Ticari çözümler

Açık kaynak araçların yanı sıra ticari çözümler de vardır: Redgate SQL Change Automation, Datical DB ve DBmaestro. Bunlar görsel şema karşılaştırması, otomatik çakışma çözümü ve CI/CD ardışık yapı entegrasyonu sağlar. Ancak, çoğu proje için Flyway veya Alembic, ek lisans olmadan ihtiyaçların %100'ünü karşılar.

Flyway ile Migrasyon

Flyway ile Kotlin'de pratik bir Schema Migration örneğine bakalım. PostgreSQL veritabanına orders tablosu ekleyen bir migrasyon oluşturacağız. Flyway otomatik olarak flyway_schema_history tablosunu oluşturur ve uygulanan sürümleri izler.

sql
-- V1__Create_Orders_Table.sql
CREATE TABLE orders (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id         UUID NOT NULL,
    total_amount    DECIMAL(10,2) NOT NULL,
    currency        VARCHAR(3) NOT NULL DEFAULT 'USD',
    status          VARCHAR(20) NOT NULL DEFAULT 'pending',
    created_at     TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
);

dataSource yapılandırması aracılığıyla bir Kotlin projesinde Flyway bağlantısı. Kurulumdan sonra flyway:migrate komutu, classpath'teki tüm yeni migrasyonları uygulayacaktır.

kotlin
// FlywayConfig.kt — Spring Boot'ta Flyway yapılandırması
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.flywaydb.core.Flyway

@Configuration
class FlywayConfig {
    @Bean
    fun flyway(dataSource: DataSource): Flyway {
        return Flyway.configure()
            .dataSource(dataSource)
            .locations("classpath:db/migration")
            .baselineOnMigrate(true)
            .load()
    }
}

Python Projeleri İçin Alembic

Alembic, SQLAlchemy üzerine inşa edilmiş Python için bir Schema Migration aracıdır. Temel özelliği, SQLAlchemy modelini mevcut veritabanı şemasıyla karşılaştırarak betikleri otomatik olarak oluşturmaktır. Alembic, Django, FastAPI ve Flask projeleri için uygundur.

Başlatma ve migrasyon oluşturma

Başlatma (alembic init alembic) ve bağlantı dizesini yapılandırdıktan sonra, alembic revision --autogenerate komutu SQLAlchemy modellerini tarar ve bir migrasyon betiği oluşturur. Geliştiricinin yalnızca oluşturulan kodu incelemesi ve alembic upgrade head ile uygulaması gerekir. Autogenerate, manuel DDL yazma saatlerinden tasarruf sağlar.

python
# models.py — otomatik oluşturma için SQLAlchemy modeli
from sqlalchemy import Column, Integer, String, DateTime, Enum
from sqlalchemy.orm import DeclarativeBase
import enum

class OrderStatus(enum.Enum):
    pending = "pending"
    paid = "paid"
    shipped = "shipped"

class Base(DeclarativeBase):
    pass

class Order(Base):
    __tablename__ = "orders"
    id = Column(Integer, primary_key=True)
    status = Column(Enum(OrderStatus), nullable=False)
    created_at = Column(DateTime, nullable=False)

Şema Migrasyonu En İyi Uygulamaları

Deneyimli ekipler, başarısızlık riskini azaltan ve hata ayıklamayı basitleştiren bir dizi Schema Migration kuralı geliştirmiştir. Bu uygulamaları takip etmek, olgun bir mühendislik kültürünün işaretidir. Beş temel kural, migrasyonların tasarımını, testini ve dağıtımını kapsar.

Bir migrasyon — bir değişiklik

Her Schema Migration tam olarak bir mantıksal değişiklik yapmalıdır: tablo oluşturma, sütun ekleme veya dizin değiştirme. Birden çok işlemi tek bir migrasyonda karıştırmak rollback'i karmaşık hale getirir — ikinci işlem başarısız olursa, birincisi zaten uygulanmıştır ve ayrı olarak geri alınması gerekir. Küçük adımlar güvenilir migrasyonların temelidir.

Yayınlanan migrasyonları asla düzenlemeyin

Bir migrasyon üretime uygulandıktan sonra değiştirilemez — yalnızca sorunu çözen yeni bir migrasyon oluşturulabilir. Yayınlanan bir migrasyonu düzenlemek izleyiciyi bozar: farklı bir veritabanına sahip geliştiriciler bir hash uyuşmazlığı görecektir. Değiştirilemez migrasyonlar, tüm ortamlarda öngörülebilir davranışı garanti eder.

Üretim kopyasında test etme

Bir Schema Migration'ı üretime uygulamadan önce, üretim verilerinin bir kopyasında çalıştırın. Amaç, yürütme hızını, tablo kilitlerinin varlığını ve değişikliklerin doğruluğunu kontrol etmektir. Büyük tablolar için ALTER TABLE saatlerce yazmayı engelleyebilir — testler bunu önceden belirleyecektir. Üretim dökümüyle Staging zorunlu bir adımdır.

Yeni sütunlar için NOT NULL'dan kaçınma

NOT NULL ile varsayılan değeri olmayan yeni bir sütun, migrasyon başarısızlığının yaygın bir nedenidir. Mevcut kayıtlarda değer NULL olacak ve NOT NULL bir hataya neden olacaktır. En iyi uygulama: sütunu varsayılan değer ve nullable ile oluşturun, ardından verileri doldurduktan sonra ayrı bir migrasyonda NOT NULL ekleyin.

Sıkça sorulan sorular

Schema Migration ve Data Migration arasındaki fark nedir?

Schema Migration veritabanı yapısını (tablolar, sütunlar, dizinler) yönetirken, Data Migration içeriği (satırlar, belgeler) yönetir. Schema Migration her zaman önce çalışır, hedef şemayı oluşturur, ardından Data Migration onu verilerle doldurur. Farklı araçlar: şemalar için Flyway, veriler için ETL.

Yeni bir proje için hangi şema migrasyon aracı seçilmelidir?

Java/Kotlin için — Flyway en basit ve en hızlısı. Python için — Alembic, SQLAlchemy ile entegre. .NET için — Entity Framework Migrations. Çok dilli projeler için — Liquibase bağımsız tanımlama formatıyla.

Schema Migration nasıl geri alınır?

Flyway otomatik rollback'i desteklemez — ayrı bir geri alma betiği yazmanız gerekir. Liquibase, XML/YAML formatı için otomatik olarak rollback oluşturur. Alembic, her migrasyon için bir downgrade işlevi oluşturur. Rollback yerine yeni bir migrasyonla değiştirilemez yaklaşım modern uygulamadır.

Üretimde bir migrasyon başarısız olursa ne olur?

Araç, migrasyonu başarısız olarak işaretler. Veritabanı, uygulamadan önceki durumunda kalır (otomatik commit yoksa). Hatayı yeni bir migrasyonda düzeltmeniz ve tekrar çalıştırmanız gerekir. Asla başarısız bir migrasyonu düzenlemeyin — yenisini oluşturun.

Şema migrasyon aracı kullanmak zorunlu mu?

Üretim projesi için — evet. Git dışında manuel DDL değişiklikleri şema sapmasına, bozuk dağıtımlara ve veri kaybına yol açar. Bir MVP için bile minimum bir araç kullanın — örneğin, birkaç SQL betiğiyle Flyway. Bu, staging'e ilk dağıtımda kendini amorti edecektir.

Özet

  • Schema Migration — Git'teki betiklerle veritabanı yapısında sürümlü değişiklik.
  • dev, staging ve üretim ortamları arasındaki şema tutarlılığı sorunlarını çözer.
  • Flyway Java/Kotlin için standarttır, Alembic Python için, Liquibase çok dilli projeler için.
  • Bir migrasyon = bir değişiklik. Yayınlanan migrasyonları düzenlemeyin.
  • Migrasyonları uygulamadan önce üretim verilerinin bir kopyasında test edin.
  • Yeni sütunları varsayılan değerlerle nullable olarak oluşturun, ayrı bir migrasyonda NOT NULL ekleyin.
  • Eski migrasyonların otomatik rollback'inden ziyade yeni migrasyonla değiştirilemez yaklaşım daha güvenilirdir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun