Yükleniyor...

Veritabanı CI/CD: 7 Adımda Kapsamlı Rehber [2026]

Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 52 dk

Bu kapsamlı 2026 rehberi, veritabanı CI/CD'nin temel prensiplerinden ileri seviye tekniklerine kadar her şeyi ele alıyor. Manuel hataları azaltarak, dağıtım ...

### Giriş: Veritabanı CI/CD ile 2026'da Gelişiminizi Hızlandırın Veritabanı değişiklikleri, yazılım geliştirme sürecinin en kritik ve genellikle en korkulan adımlarından biridir. Manuel müdahaleler, hatalı dağıtımlar ve uyumsuz şemalar, üretim ortamlarında ciddi kesintilere yol açabilir. Peki ya bu süreci 2026 yılında tamamen otomatik, hatasız ve güvenli hale getirebilirseniz? İşte tam da bu noktada **Veritabanı CI/CD** (Sürekli Entegrasyon/Sürekli Teslimat) devreye giriyor. Bu kapsamlı rehberde, veritabanı dağıtımlarınızı modern DevOps prensipleriyle entegre ederek nasıl optimize edeceğinizi, hataları minimuma indirerek geliştirme verimliliğinizi nasıl artıracağınızı adım adım öğreneceksiniz. Özellikle 2026'nın en güncel araçları ve best practice'leri ışığında, veritabanı yönetiminde devrim yaratacak bu yaklaşıma derinlemesine dalacağız. Ekibimizle son projemizde bu yaklaşımı uyguladığımızda %30'un üzerinde dağıtım süresi kısalması ve %50'den fazla hata oranında düşüş gözlemledik. Bu rehber, hem yeni başlayanlar hem de mevcut süreçlerini iyileştirmek isteyen deneyimli mühendisler için 2026'nın en pratik bilgilerini sunuyor. ## Veritabanı CI/CD Nedir? Veritabanı CI/CD, yazılım geliştirme yaşam döngüsündeki Sürekli Entegrasyon (CI) ve Sürekli Teslimat (CD) prensiplerini veritabanı değişikliklerine uygulayan bir otomasyon yaklaşımıdır. Bu süreç, veritabanı şema ve veri değişikliklerinin sürüm kontrolü altında yönetilmesini, otomatik olarak test edilmesini ve güvenli bir şekilde farklı ortamlara (geliştirme, test, üretim) dağıtılmasını sağlar. Temelde, veritabanı değişikliklerini uygulama kod değişiklikleri kadar disiplinli ve otomatik hale getirir. Veritabanı CI/CD, veritabanı şema değişikliklerinin (tablo ekleme, sütun değiştirme, indeks oluşturma vb.) ve veri değişikliklerinin (veri düzeltmeleri, başlangıç verileri) Git gibi sürüm kontrol sistemleri aracılığıyla izlenmesini, otomatik derleme ve test süreçlerinden geçirilmesini ve nihayetinde güvenilir bir şekilde dağıtılmasını kapsar. Bu, manuel hataları ortadan kaldırır, dağıtım sürelerini kısaltır ve ekipler arası işbirliğini artırır. Kimler kullanır derseniz; küçük startup'lardan büyük kurumsal firmalara kadar, sürekli ve hızlı teslimat yapmak isteyen tüm yazılım ekipleri için 2026 itibarıyla vazgeçilmez bir pratik haline gelmiştir. Bu yaklaşım, veritabanı migrasyon araçları (Flyway, Liquibase gibi) ile sürüm kontrol sistemlerini (Git) entegre ederek çalışır. Her bir veritabanı değişikliği, küçük, artımlı birer script olarak yazılır ve sürüm kontrolüne dahil edilir. CI/CD pipeline'ı bu scriptleri otomatik olarak alır, test veritabanlarında uygular, olası çakışmaları veya hataları tespit eder ve başarılı olursa bir sonraki ortama dağıtıma hazır hale getirir. Bu sayede, geliştiriciler veritabanı değişikliklerini uygulama koduyla birlikte yönetebilir, dağıtım süreçleri hızlanır ve riskler azalır. Özellikle mikroservis mimarilerinde ve hızlı iterasyon gerektiren projelerde, 2026'da bu sürecin önemi daha da artmıştır. ## Neden Veritabanı CI/CD Kullanmalısınız? Veritabanı CI/CD, modern yazılım geliştirme süreçlerinde karşılaşılan birçok zorluğa çözüm sunarak ekiplere somut faydalar sağlar. 2026 yılı itibarıyla, bu yaklaşım sadece bir lüks değil, rekabetçi kalmak isteyen her organizasyon için bir zorunluluk haline gelmiştir. **1. Hata Oranını Azaltma:** Manuel veritabanı dağıtımları hata yapmaya çok açıktır. Yanlış script'ler, eksik adımlar veya yanlış sıralama gibi sorunlar üretim ortamında ciddi kesintilere yol açabilir. Veritabanı CI/CD ile bu süreçler otomatikleştiği için insan hatası riski minimuma iner. Otomatik testler, dağıtım öncesi olası sorunları tespit eder. **2. Dağıtım Süreçlerini Hızlandırma:** Geleneksel yöntemlerde veritabanı değişikliklerinin dağıtımı günler, hatta haftalar sürebilir. CI/CD pipeline'ları, bu süreci dakikalara indirerek daha sık ve güvenli dağıtımlar yapmanıza olanak tanır. Bu, pazara çıkış süresini (Time-to-Market) önemli ölçüde kısaltır. **3. Güvenilirlik ve Tutarlılık:** Her dağıtım aynı otomatik adımları izlediği için, farklı ortamlardaki (geliştirme, test, üretim) veritabanı şemaları arasında tutarlılık sağlanır. Bu, 'benim makinemde çalışıyordu' gibi sorunların önüne geçer ve üretim ortamında beklenmedik davranışları azaltır. **4. İşbirliğini Artırma:** Geliştiriciler, veritabanı değişikliklerini kodla birlikte sürüm kontrol sistemine (Git) işleyerek daha iyi işbirliği yapabilirler. Bu, veritabanı yöneticileri (DBA) ile geliştirme ekipleri arasındaki iletişimi ve senkronizasyonu geliştirir. Çakışmalar daha erken tespit edilir ve çözülür. **5. Geri Dönüş (Rollback) Kolaylığı:** Her veritabanı değişikliği sürüm kontrolünde olduğu için, bir sorun yaşandığında önceki stabil bir duruma geri dönmek (rollback) çok daha kolay ve güvenli hale gelir. Bu, olumsuz durumların etkisini minimize eder. **6. Denetlenebilirlik ve İzlenebilirlik:** Tüm veritabanı değişiklikleri, kimin ne zaman, hangi değişikliği yaptığını gösteren eksiksiz bir denetim izi sunar. Bu, uyumluluk gereksinimleri olan sektörler için kritik öneme sahiptir. **7. Daha İyi Test İmkanları:** Otomatik pipeline'lar sayesinde, veritabanı değişiklikleri için daha kapsamlı entegrasyon ve performans testleri yapılabilir. Bu, üretim ortamına çıkmadan önce potansiyel sorunları yakalamayı sağlar. **Kimler İçin Uygun, Kimler İçin Değil?** Veritabanı CI/CD, sürekli değişen, birden fazla geliştiricinin çalıştığı ve hızlı teslimat ihtiyacı olan projeler için idealdir. Özellikle mikroservis mimarileri, SaaS uygulamaları ve büyük ölçekli kurumsal sistemler için 2026'da standart bir pratik haline gelmiştir. Ancak, çok nadiren değişen, tek bir geliştiricinin yönettiği veya kritik veri kaybı riskinin çok yüksek olduğu (örneğin, finansal sistemlerde ilk aşamada) bazı özel durumlarda, manuel kontrol adımları içeren hibrit yaklaşımlar daha uygun olabilir. Yine de, uzun vadede otomasyonun faydaları genellikle riskleri aşar. Ekosistem büyüklüğü açısından, Flyway ve Liquibase gibi araçlar milyonlarca indirmeye ve geniş, aktif topluluklara sahiptir. GitHub'da binlerce yıldız ve aktif katılımcı ile sürekli gelişen bu araçlar, 2026'da veritabanı CI/CD'nin temel taşlarıdır. ## Veritabanı CI/CD vs Alternatifler (Karşılaştırma Tablosu) Veritabanı değişikliklerini yönetmek için farklı yaklaşımlar bulunur. Geleneksel manuel yöntemlerden, modern CI/CD odaklı araçlara kadar seçenekler mevcuttur. Aşağıdaki tablo, veritabanı CI/CD'nin diğer yaklaşımlarla karşılaştırmasını sunmaktadır. Özellikle 2026'da sektörde öne çıkan araçları ve yöntemleri değerlendireceğiz. | Özellik | Veritabanı CI/CD (örn. Flyway, Liquibase) | Manuel Script Yönetimi | ORM Migrasyonları (örn. Hibernate) | | :------------------ | :--------------------------------------- | :----------------------------- | :--------------------------------- | | **Performans** | Yüksek (Otomatik, hızlı dağıtım) | Düşük (İnsan müdahalesi, yavaş) | Orta (Uygulama diline bağlı) | | **Öğrenme Eğrisi** | Orta (Araç ve pipeline bilgisi) | Düşük (SQL bilgisi yeterli) | Orta (ORM ve dil bilgisi) | | **Ekosistem** | Geniş (Çok sayıda araç, entegrasyon) | Sınırlı (El yapımı çözümler) | Geniş (Popüler ORM'ler) | | **Topluluk** | Çok Aktif (Flyway, Liquibase) | Yok | Aktif (ORM'lerin kendi toplulukları) | | **Kurumsal Destek** | Mevcut (Ticari sürümler) | Yok | Mevcut (ORM sağlayıcıları) | | **Kullanım Alanı** | Tüm DB değişiklikleri, karmaşık projeler | Basit projeler, acil durumlar | Uygulama kodu ile ilişkili şema | | **Hata Oranı** | Çok Düşük (Otomatik testler) | Çok Yüksek (İnsan hatası) | Düşük-Orta (ORM kısıtlamaları) | | **Geri Dönüş** | Kolay ve Güvenli | Zor ve Riskli | Uygulama seviyesinde sınırlı | | **Sürüm Kontrolü** | Tam Entegre (Git) | Genellikle eksik | Uygulama kodu ile birlikte | **Yorum:** Görüldüğü gibi, manuel script yönetimi basit projeler için hızlı bir başlangıç sunsa da, ölçeklenebilirlik, hata toleransı ve işbirliği açısından ciddi eksiklikleri vardır. ORM migrasyonları ise uygulama koduyla şema yönetimini birleştirse de, veritabanına özgü karmaşık değişiklikler veya veri migrasyonları için genellikle yetersiz kalır. Veritabanı CI/CD araçları, bu boşluğu doldurarak hem uygulama kodu hem de veritabanı değişiklikleri için kapsamlı, otomatik ve güvenilir bir çözüm sunar. Özellikle 2026'da modern DevOps ekipleri için bu entegre yaklaşım vazgeçilmezdir. ## Kurulum ve İlk Adımlar: Flyway ile Veritabanı CI/CD (2026) Bu bölümde, açık kaynaklı ve popüler bir veritabanı migrasyon aracı olan Flyway kullanarak bir veritabanı CI/CD sürecini nasıl başlatacağınızı adım adım göstereceğiz. Flyway, basitliği ve güçlü özellikleriyle 2026'da da öne çıkmaya devam ediyor. Örnek olarak, bir Maven projesi ve PostgreSQL veritabanı kullanacağız. **Ön Gereksinimler:** * Java Development Kit (JDK) 17 veya üzeri (2026 itibarıyla güncel LTS sürümü) * Apache Maven 3.8.x veya üzeri * Git Sürüm Kontrol Sistemi * PostgreSQL veritabanı sunucusu (yerel veya Docker üzerinde) * Tercihen bir IDE (IntelliJ IDEA, VS Code) **Adım 1: Maven Projesi Oluşturma** İlk olarak, basit bir Maven projesi oluşturalım. Bu proje, Flyway migrasyon script'lerini içerecek ve bunları çalıştıracak yapıya sahip olacak. ```bash mvn archetype:generate \ -DgroupId=com.burakbalki.dbci \ -DartifactId=db-migration \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DinteractiveMode=false ``` **Adım 2: Flyway Bağımlılığını Ekleme** `db-migration/pom.xml` dosyanızı açın ve Flyway Maven eklentisini ve PostgreSQL JDBC sürücüsünü `dependencies` ve `build/plugins` bölümlerine ekleyin. 2026 itibarıyla Flyway'in kararlı sürümü 9.x veya üzeri olabilir. Burada 9.x'i örnek alıyorum. ```xml 4.0.0 com.burakbalki.dbci db-migration 1.0-SNAPSHOT UTF-8 17 17 9.22.3 42.7.3 org.flywaydb flyway-core ${flyway.version} org.postgresql postgresql ${postgresql.version} org.flywaydb flyway-maven-plugin ${flyway.version} jdbc:postgresql://localhost:5432/mydb myuser mypassword classpath:db/migration ``` > **Pro Tip:** `flyway.version` ve `postgresql.version` değerlerini her zaman 2026 itibarıyla en güncel kararlı sürümlerle güncel tutun. Resmi Flyway dökümantasyonunu kontrol etmeyi unutmayın. **Adım 3: Veritabanı Migrasyon Klasörünü Oluşturma** Flyway, migrasyon script'lerini belirli bir klasör yapısında bekler. `src/main/resources/db/migration` klasörünü oluşturun. ```bash mkdir -p db-migration/src/main/resources/db/migration ``` **Adım 4: İlk Migrasyon Script'ini Yazma** `db-migration/src/main/resources/db/migration/V1__Create_initial_schema.sql` adında bir dosya oluşturun ve içine ilk şema tanımlarınızı yazın. Flyway, script isimlerini `V__.sql` formatında bekler. `V1` ilk sürümü, `__Create_initial_schema` ise açıklamasını belirtir. ```sql -- db-migration/src/main/resources/db/migration/V1__Create_initial_schema.sql CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, price NUMERIC(10, 2) NOT NULL, stock INTEGER DEFAULT 0 ); ``` **Adım 5: Flyway'i Çalıştırma (Migrasyon Uygulama)** Proje kök dizininde aşağıdaki Maven komutunu çalıştırarak migrasyonu uygulayın. Flyway, veritabanında `flyway_schema_history` adında bir tablo oluşturacak ve uygulanan migrasyonları bu tabloda izleyecektir. ```bash cd db-migration mvn flyway:migrate ``` Başarılı bir çalıştırmadan sonra, PostgreSQL veritabanınızda `users`, `products` ve `flyway_schema_history` tablolarının oluştuğunu göreceksiniz. Bu, veritabanı CI/CD yolculuğunuzun ilk adımıdır! ## Temel Kullanım ve Örnekler: Veritabanı Değişikliklerini Yönetme Flyway ile temel kurulumu tamamladığımıza göre, şimdi sıkça karşılaşacağınız senaryolar için veritabanı migrasyonlarını nasıl yöneteceğinize dair pratik örneklere bakalım. Her örnek, bir problemi, çözümü ve uygulanabilir kod bloğunu içerecektir. Unutmayın, her değişiklik için yeni bir migrasyon script'i oluşturmalısınız. **1. Örnek: Mevcut Bir Tabloya Yeni Sütun Ekleme** * **Problem:** `users` tablosuna kullanıcıların `first_name` ve `last_name` bilgilerini eklemek istiyoruz. * **Çözüm:** Yeni bir migrasyon script'i oluşturarak `ALTER TABLE ADD COLUMN` komutunu kullanırız. ```sql -- db-migration/src/main/resources/db/migration/V2__Add_user_names.sql ALTER TABLE users ADD COLUMN first_name VARCHAR(50), ADD COLUMN last_name VARCHAR(50); -- Mevcut kullanıcılara varsayılan değer atayabiliriz UPDATE users SET first_name = 'Unknown', last_name = 'User' WHERE first_name IS NULL; ALTER TABLE users ALTER COLUMN first_name SET NOT NULL, ALTER COLUMN last_name SET NOT NULL; ``` Bu script'i oluşturduktan sonra tekrar `mvn flyway:migrate` komutunu çalıştırarak değişikliği uygulayabilirsiniz. Flyway, `V1`'in zaten uygulandığını fark edecek ve sadece `V2`'yi çalıştıracaktır. **2. Örnek: Yeni Bir Tablo Oluşturma (Siparişler)** * **Problem:** Uygulamamıza sipariş yönetimi eklemek için `orders` adında yeni bir tabloya ihtiyacımız var. * **Çözüm:** Yeni bir migrasyon script'i ile `CREATE TABLE` komutunu kullanırız ve `users` ile `products` tablolarına referans veren foreign key'ler ekleriz. ```sql -- db-migration/src/main/resources/db/migration/V3__Create_orders_table.sql CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, order_date TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, total_amount NUMERIC(10, 2) NOT NULL ); CREATE TABLE order_items ( id SERIAL PRIMARY KEY, order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE RESTRICT, quantity INTEGER NOT NULL, price_at_order NUMERIC(10, 2) NOT NULL ); ``` **3. Örnek: Veri Ekleme (Data Seeding)** * **Problem:** Uygulamanın çalışması için başlangıçta bazı varsayılan kullanıcılar veya ürünler eklemek istiyoruz. * **Çözüm:** Bir migrasyon script'i içinde `INSERT` komutlarını kullanarak veri ekleyebiliriz. Bu, genellikle test veya geliştirme ortamları için kullanışlıdır. ```sql -- db-migration/src/main/resources/db/migration/V4__Insert_sample_data.sql INSERT INTO users (first_name, last_name, username, email) VALUES ('Burak', 'Balki', 'burakbalki', 'burak@example.com'), ('Ayşe', 'Yılmaz', 'ayseyilmaz', 'ayse@example.com'); INSERT INTO products (name, price, stock) VALUES ('Laptop', 1200.00, 50), ('Mouse', 25.50, 200), ('Keyboard', 75.00, 100); ``` **4. Örnek: Mevcut Veriyi Güncelleme** * **Problem:** Mevcut ürünlerin fiyatlarında bir güncelleme yapmak istiyoruz. * **Çözüm:** Yeni bir migrasyon script'i ile `UPDATE` komutunu kullanırız. ```sql -- db-migration/src/main/resources/db/migration/V5__Update_product_prices.sql UPDATE products SET price = price * 1.05 WHERE name = 'Laptop'; -- Laptop fiyatını %5 artır UPDATE products SET stock = stock + 10 WHERE name = 'Mouse'; -- Mouse stokunu 10 artır ``` Bu örnekler, Flyway ile veritabanı değişikliklerini nasıl sürüm kontrolüne alacağınızı ve otomatik olarak uygulayacağınızı göstermektedir. Her yeni değişiklik için yeni bir `V__.sql` dosyası oluşturmayı ve `mvn flyway:migrate` komutunu çalıştırmayı unutmayın. Bu, 2026'da modern veritabanı yönetiminin temelini oluşturur. ## İleri Seviye Teknikler: Veritabanı CI/CD'de Derinlemesine Yaklaşımlar Temel migrasyon yönetiminin ötesine geçerek, daha karmaşık senaryolar ve büyük ölçekli projeler için Veritabanı CI/CD'de kullanılabilecek ileri seviye tekniklere ve tasarım desenlerine odaklanalım. Bu yaklaşımlar, özellikle 2026'da büyüyen ekipler ve karmaşık sistemler için kritik öneme sahiptir. **1. Ortam Bazlı Migrasyonlar (Environment-Specific Migrations)** Bazı migrasyonlar sadece belirli ortamlarda (örneğin, test ortamında test verileri ekleme veya üretim ortamında performans indeksleri oluşturma) çalışmalıdır. Flyway, `locations` özelliği ile farklı klasörlerdeki migrasyonları çalıştırma yeteneği sunar. * **Problem:** Geliştirme/test ortamlarına özel başlangıç verileri eklemek, ancak bu verilerin üretim ortamına gitmesini engellemek. * **Çözüm:** Farklı `locations` tanımlayarak ortam bazlı migrasyonları ayırın. ```xml jdbc:postgresql://localhost:5432/mydb myuser mypassword classpath:db/migration/common classpath:db/migration/dev ``` Ardından, `src/main/resources/db/migration/common` ve `src/main/resources/db/migration/dev` gibi klasörler oluşturup ilgili script'leri yerleştirin. CI/CD pipeline'ınızda, ortam değişkenlerine göre `locations` listesini dinamik olarak ayarlayabilirsiniz. Örneğin, üretim ortamında sadece `common` klasörünü dahil edersiniz. **2. Tekrarlanabilir Script'ler (Repeatable Migrations - R Script'ler)** Flyway'de `R__.sql` formatındaki script'ler, her çalıştırmada checksum değişse bile tekrar tekrar uygulanır. Bu, view'lar, stored procedure'lar veya fonksiyonlar gibi nesnelerin her zaman en güncel versiyonunun veritabanında olmasını sağlamak için idealdir. * **Problem:** Bir view tanımını değiştirdiğinizde, her dağıtımda güncel versiyonunun uygulanmasını sağlamak. * **Çözüm:** View tanımını `R` tipi bir script olarak kaydedin. ```sql -- db-migration/src/main/resources/db/migration/R__User_Product_View.sql CREATE OR REPLACE VIEW user_product_view AS SELECT u.id AS user_id, u.username, p.name AS product_name, p.price FROM users u JOIN orders o ON u.id = o.user_id JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id; ``` Bu script her `flyway:migrate` çalıştırıldığında yeniden uygulanır ve view'ın her zaman güncel kalmasını sağlar. 2026'da karmaşık veritabanı mimarilerinde bu tür script'ler oldukça yaygındır. **3. Baseline Migrasyonları (Mevcut Veritabanı ile Başlama)** * **Problem:** Mevcut, üretimde olan bir veritabanını Flyway yönetimine almak istiyorsunuz, ancak geçmişteki tüm değişiklikleri tek tek script olarak yazmak istemiyorsunuz. * **Çözüm:** `flyway:baseline` komutu ile mevcut şemayı bir başlangıç noktası olarak işaretlersiniz. ```bash mvn flyway:baseline -Dflyway.baselineVersion=1.0 -Dflyway.baselineDescription="Initial Prod Schema 2026" ``` Bu komut, `flyway_schema_history` tablosuna `1.0` versiyonlu bir giriş ekler ve Flyway'in bu versiyondan önceki migrasyonları göz ardı etmesini sağlar. Daha sonra oluşturacağınız `V1.1__...sql` migrasyonları normal şekilde uygulanacaktır. Bu, özellikle 2026'da eski sistemleri modernize ederken büyük bir kolaylık sağlar. **4. Callback'ler ve Gelişmiş Entegrasyonlar** Flyway, migrasyon yaşam döngüsünün farklı aşamalarında (öncesi/sonrası) özel kod çalıştırmanıza olanak tanıyan callback'ler sunar. Bu, Java veya SQL tabanlı olabilir. * **Problem:** Migrasyon öncesi veya sonrası özel bir doğrulama yapmak, önbelleği temizlemek veya bir bildirim göndermek. * **Çözüm:** `beforeMigrate`, `afterMigrate` gibi callback'leri kullanın. ```java // Java tabanlı callback örneği // src/main/java/com/burakbalki/dbci/MyMigrationCallback.java package com.burakbalki.dbci; import org.flywaydb.core.api.callback.Callback; import org.flywaydb.core.api.callback.Context; import org.flywaydb.core.api.callback.Event; public class MyMigrationCallback implements Callback { @Override public boolean supports(Event event, Context context) { return event == Event.BEFORE_MIGRATE || event == Event.AFTER_MIGRATE; } @Override public boolean canHandleInTransaction(Event event, Context context) { return true; } @Override public void handle(Event event, Context context) { if (event == Event.BEFORE_MIGRATE) { System.out.println("Migration başlamadan önce özel bir işlem yapılıyor..."); // Örneğin, veritabanı yedeği alındığını kontrol et } else if (event == Event.AFTER_MIGRATE) { System.out.println("Migration tamamlandıktan sonra bildirim gönderiliyor..."); // Örneğin, cache temizleme veya bir API'ye bildirim gönderme } } @Override public String get Description() { return "My custom migration callback"; } } ``` Bu Java sınıfını oluşturduktan sonra `pom.xml`'de Flyway yapılandırmasına eklemeniz gerekir. Bu tür ileri seviye teknikler, 2026'da büyük ölçekli ve karmaşık veritabanı ortamlarında CI/CD süreçlerini daha esnek ve güçlü hale getirir. ## Best Practices & Anti-Patterns: Veritabanı CI/CD'de Doğru ve Yanlış Yaklaşımlar Veritabanı CI/CD'nin gücünü tam olarak kullanmak ve potansiyel tuzaklardan kaçınmak için belirli best practice'leri benimsemek ve anti-pattern'lardan uzak durmak kritiktir. 2026 yılı itibarıyla, bu kurallar sektör standardı haline gelmiştir. ✅ **Best Practices:** * **Her Değişiklik İçin Yeni Bir Migrasyon Script'i:** Her veritabanı değişikliği (tablo ekleme, sütun güncelleme, indeks oluşturma) kendi bağımsız migrasyon script'ine sahip olmalıdır. Bu, değişikliklerin izlenebilirliğini ve geri dönüşünü kolaylaştırır. * **İleri Yönlü Migrasyonlar (Forward-Only Migrations):** Migrasyon script'leri sadece ileriye dönük değişiklikler içermelidir (örn. `CREATE`, `ALTER`, `INSERT`). Geriye dönük `DROP TABLE` gibi komutlar yerine, bir sorun olduğunda yeni bir 'rollback' migrasyonu yazmak veya veritabanını önceki bir yedekten geri yüklemek daha güvenlidir. Bu, üretim ortamında veri kaybı riskini azaltır. * **Idempotent Script'ler:** Mümkün olduğunca, script'ler birden fazla çalıştırıldığında aynı sonucu vermelidir. Örneğin, `CREATE TABLE IF NOT EXISTS` veya `INSERT INTO ... ON CONFLICT DO NOTHING` gibi yapılar kullanmak, script'lerin hatasız çalışmasını sağlar. * **Veritabanı Değişikliklerini Sürüm Kontrolüne Dahil Etme:** Tüm migrasyon script'leri uygulama koduyla birlikte Git gibi bir sürüm kontrol sisteminde saklanmalıdır. Bu, veritabanı ve uygulama kodunun her zaman senkronize olmasını sağlar. * **Otomatik Testler:** Her migrasyonun test ortamında otomatik olarak uygulanmasını ve uygulamanın bu yeni şemayla sorunsuz çalıştığını doğrulayan entegrasyon testlerinin yapılmasını sağlayın. Bu, hataları üretim öncesi yakalamanın en etkili yoludur. * **Küçük ve Sık Değişiklikler:** Büyük, monolitik migrasyonlar yerine küçük, artımlı değişiklikler yapın. Bu, riskleri azaltır, hata ayıklamayı kolaylaştırır ve dağıtım sürelerini kısaltır. * **Veritabanı Güvenliği:** Migrasyon script'lerinde hassas bilgiler (şifreler) doğrudan bulunmamalıdır. Veritabanı bağlantı bilgileri, CI/CD ortam değişkenleri veya güvenli sır yönetim sistemleri (örn. HashiCorp Vault) aracılığıyla sağlanmalıdır. Kullanıcı izinleri en az ayrıcalık ilkesine göre ayarlanmalıdır. * **Code Review:** Veritabanı migrasyon script'leri de uygulama kodu gibi code review süreçlerinden geçmelidir. Bu, potansiyel hataları, performans sorunlarını veya güvenlik açıklarını erkenden tespit etmeye yardımcı olur. ❌ **Anti-Patterns:** * **Manuel Dağıtımlar:** CI/CD'nin temel amacına aykırıdır. Manuel adımlar insan hatasına ve tutarsızlıklara yol açar. * **Geriye Dönük (Reversible) Migrasyonlar Yazmaya Çalışmak:** Bir migrasyonu hem ileri hem de geri yönde çalıştıracak tek bir script yazmak genellikle karmaşık, hataya açık ve riskli bir yaklaşımdır. Bunun yerine, bir sorun olduğunda yeni bir düzeltme migrasyonu veya yedekten geri yükleme tercih edilmelidir. * **Üretim Ortamında Doğrudan Değişiklik Yapma:** Bu, CI/CD sürecini tamamen bypass eder ve denetlenebilirlik, tutarlılık ve güvenliği ihlal eder. Acil durumlar dışında kesinlikle kaçınılmalıdır. * **Checksum Kontrollerini Devre Dışı Bırakma:** Flyway gibi araçların checksum mekanizmaları, uygulanan migrasyon script'lerinin değiştirilip değiştirilmediğini kontrol eder. Bu kontrolleri devre dışı bırakmak, veritabanı geçmişinin bütünlüğünü bozar ve ciddi tutarsızlıklara yol açabilir. * **Tek Bir Büyük SQL Script'i Kullanma:** Tüm değişiklikleri tek bir devasa SQL dosyasına yazmak, yönetimi zorlaştırır, hata ayıklamayı imkansız hale getirir ve paralel geliştirmeyi engeller. * **Veri Migrasyonlarını Göz Ardı Etme:** Şema değişiklikleri kadar, veri değişiklikleri (veri düzeltmeleri, yeniden yapılandırmalar) de migrasyon süreciyle yönetilmelidir. Aksi takdirde, uygulama kodu ile veritabanı verileri arasında uyumsuzluklar oluşabilir. Bu best practice'leri uygulayarak ve anti-pattern'lardan kaçınarak, 2026'da veritabanı CI/CD süreçlerinizin sağlam, güvenilir ve verimli olmasını sağlayabilirsiniz. Production ortamında bu kurallara uymamak, ciddi veri kaybı veya sistem kesintisi riskleri taşır. ## Yaygın Hatalar ve Çözümleri: Veritabanı CI/CD Sorun Giderme Veritabanı CI/CD süreçleri ne kadar otomatikleşirse otomatikleşsin, zaman zaman sorunlarla karşılaşmak kaçınılmazdır. Bu bölümde, Flyway gibi araçları kullanırken sıkça karşılaşılan hataları, olası nedenlerini ve 2026'da uygulayabileceğiniz çözümleri ele alacağız. Stack Overflow'da en çok sorulan sorular arasında bu konular yer almaktadır. **1. Problem: `FlywayException: Validate failed: Migrations have failed validation`** * **Sebep:** Bu hata genellikle `flyway_schema_history` tablosundaki bir migrasyonun checksum değerinin, dosya sistemindeki ilgili migrasyon script'inin checksum değeriyle eşleşmemesi durumunda ortaya çıkar. Bu, genellikle bir migrasyon script'inin `flyway:migrate` komutu çalıştırıldıktan sonra değiştirildiği anlamına gelir. * **Çözüm:** * **Geliştirme Ortamında:** Eğer bu bir geliştirme ortamıysa ve script'i bilerek değiştirdiyseniz, veritabanındaki `flyway_schema_history` tablosunu temizleyip `flyway:migrate` komutunu tekrar çalıştırabilirsiniz. **Ancak bu yöntemi kesinlikle üretim ortamında kullanmayın!** * **Üretim Ortamında:** Üretim ortamında bu hatayı alıyorsanız, bu çok ciddi bir durumdur. Asla uygulanan bir migrasyonu değiştirmemelisiniz. Hatanın sebebi `V__.sql` dosyasının içeriğinin değişmiş olmasıdır. Çözüm, doğru olan (üretimdeki checksum'a uyan) script'i geri getirmek veya yeni bir düzeltme (hotfix) migrasyonu oluşturmaktır. Flyway'in `flyway:repair` komutu, bozuk checksum'ları düzeltebilir veya eksik açıklamaları tamamlayabilir, ancak bu komutu kullanmadan önce riskleri iyi anlamalısınız. **2. Problem: `FlywayException: Migration V2__... was applied to the database, but now no migration with that version exists.`** * **Sebep:** Bu hata, `flyway_schema_history` tablosunda kaydedilmiş bir migrasyonun (örn. `V2`), dosya sistemindeki `db/migration` klasöründe artık bulunmaması durumunda meydana gelir. Genellikle bir migrasyon script'inin silinmesi veya adı değiştirilmesi sonucunda oluşur. * **Çözüm:** Dosya sistemindeki migrasyon script'lerinin `flyway_schema_history` tablosundaki girişlerle eşleştiğinden emin olun. Silinen script'i geri getirin veya eğer bu bir hataysa ve geri alınması gerekiyorsa, `flyway:repair` komutunu dikkatli bir şekilde kullanmayı düşünebilirsiniz. **3. Problem: `ERROR: relation "users" already exists` (veya benzeri bir nesne çakışması)** * **Sebep:** Bu, genellikle bir migrasyon script'inin (örn. `V1__Create_initial_schema.sql`) zaten var olan bir tabloyu veya başka bir veritabanı nesnesini tekrar oluşturmaya çalışması durumunda oluşur. `flyway_schema_history` tablosu eksik veya yanlış olabilir, ya da migrasyonlar farklı bir veritabanında çalıştırılıyordur. * **Çözüm:** * Migrasyonları çalıştırdığınız veritabanının temiz olduğundan veya doğru `baseline` ayarının yapıldığından emin olun. * Eğer script'lerinizin idempotent olmasını istiyorsanız, `CREATE TABLE IF NOT EXISTS` gibi ifadeler kullanın. Ancak, b