Sql & Veritabanı İle Uygulamalar İçin Veri Taşıma Ve Migrasyon Nasıl Yapılır?

Sql & Veritabanı İle Uygulamalar İçin Veri Taşıma Ve Migrasyon Nasıl Yapılır?
Sql & Veritabanı İle Uygulamalar İçin Veri Taşıma Ve Migrasyon Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Veri taşıma işlemlerine başlamadan önce ortamınızın hazır olduğundan emin olmalısınız. Migrasyon süreci, veritabanı yönetim sisteminizin (DBMS) sürümüne ve kullandığınız framework'e göre değişiklik gösterir. 2026 yılı itibarıyla, PostgreSQL 17+ veya MySQL 9.0 gibi güncel sürümlerle çalışmanız önerilir.

  • Yedekleme: İşleme başlamadan önce mutlaka tam bir veritabanı yedeği alın.
  • Test Ortamı: Migrasyon senaryolarını önce bir sandbox (geliştirme) ortamında deneyin.
  • Yetkilendirme: Veritabanı üzerinde 'schema' oluşturma ve veri manipülasyonu için gerekli 'GRANT' yetkilerine sahip olun.
  • Araçlar: SQL dump araçları (pg_dump, mysqldump) veya ORM tabanlı migrasyon araçları (Laravel Migrations, Entity Framework Core).

Adım 1: Veritabanı Şeması ve Veri Yapısının Hazırlanması

Migrasyonun ilk adımı, kaynak veritabanındaki yapının hedef veritabanına doğru şekilde aktarılmasıdır. Şema taşıma işleminde tablolar, indeksler, kısıtlamalar (constraints) ve tetikleyiciler (triggers) tanımlanmalıdır. Aşağıdaki SQL örneği, bir tablonun yapısını yeni bir veritabanına aktarmak için kullanılır.

-- Yeni tablo yapısının oluşturulması
CREATE TABLE kullanicilar (
    id SERIAL PRIMARY KEY,
    kullanici_adi VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    olusturulma_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- İndeks oluşturma
CREATE INDEX idx_kullanici_email ON kullanicilar(email);

Bu kod bloğu, verinin tutarlı bir şekilde depolanması için gerekli olan temel yapıyı kurar. SERIAL veri tipi, PostgreSQL gibi sistemlerde otomatik artan kimlikler için standarttır.

Adım 2: Veri Taşıma Stratejileri ve Yöntem Karşılaştırması

Veri taşıma işlemlerinde kullanılan yöntemler, verinin boyutuna ve sistemin kapalı kalma süresine (downtime) göre seçilmelidir. Aşağıdaki tablo, yaygın yöntemlerin avantaj ve dezavantajlarını özetler.

Yöntem Avantajı Dezavantajı
SQL Dump & Restore Basit, güvenilir, standart Büyük verilerde uzun sürer
ETL Süreçleri Veri dönüşümü mümkün Karmaşık yapılandırma
Replikasyon Sıfıra yakın kesinti Yüksek altyapı maliyeti

Adım 3: SQL Dump ile Veri Aktarımı

Küçük ve orta ölçekli projelerde en güvenilir yöntem, veritabanını bir SQL dosyası olarak dışa aktarmak ve hedef sistemde çalıştırmaktır. Bu işlem sırasında veri bütünlüğünü korumak için 'transaction' (işlem bloğu) kullanmak önemlidir.

-- Veri aktarımı sırasında işlem güvenliği
BEGIN;

-- Verilerin hedef tabloya aktarılması
INSERT INTO hedef_tablo (id, ad, soyad)
SELECT id, ad, soyad FROM kaynak_tablo;

-- Hata kontrolü
COMMIT;

BEGIN ve COMMIT komutları, işlemin ya tamamen gerçekleşmesini ya da bir hata durumunda hiçbir verinin bozulmadan geri alınmasını (rollback) sağlar.

Adım 4: ORM Tabanlı Migrasyon Yönetimi

Modern frameworkler (Laravel, Django, .NET Core) kendi migrasyon yönetim sistemlerine sahiptir. Bu araçlar, veritabanı değişikliklerini birer kod dosyası (versiyon kontrolü) olarak tutmanızı sağlar. Bu, ekip içindeki değişikliklerin senkronize edilmesini kolaylaştırır.

// Örnek bir migrasyon dosyası mantığı (Pseudo-code)
public function up()
{
    Schema::table('kullanicilar', function (Blueprint $table) {
        $table->string('telefon_no')->nullable();
    });
}

Bu yöntem, veritabanı şemasını uygulama koduyla birlikte versiyonlamanıza olanak tanır. up() metodu değişiklikleri uygular, down() metodu ise gerekirse geri alır.

Adım 5: Veri Taşıma Sonrası Doğrulama ve Test

Veriler taşındıktan sonra, kaynak ve hedef veritabanları arasındaki tutarlılığı doğrulamak zorunludur. Satır sayılarını karşılaştırmak, toplam tutarları kontrol etmek ve örnek veri kayıtlarını incelemek temel adımlardır.

-- Satır sayısı karşılaştırma sorgusu
SELECT COUNT(*) FROM kaynak_tablo;
SELECT COUNT(*) FROM hedef_tablo;

-- Veri bütünlüğü kontrolü
SELECT * FROM hedef_tablo WHERE id NOT IN (SELECT id FROM kaynak_tablo);

Eğer iki sorgu sonucu farklıysa, taşıma sırasında bir veri kaybı yaşanmış demektir. Bu durumda log dosyalarını inceleyerek hangi kayıtların aktarılmadığını tespit etmelisiniz.

Kritik Güvenlik Uyarısı: Veritabanı taşıma işlemleri sırasında hassas verileri (şifreler, kişisel kimlik bilgileri) asla düz metin (plain-text) olarak loglamayın. Taşıma sırasında veritabanı bağlantı bilgilerini (.env dosyaları gibi) güvenli tutun ve SQL Injection saldırılarına karşı her zaman parametreli sorgular (prepared statements) kullanın.

Adım 6: Yaygın Hatalar ve Debug İpuçları

Veri taşıma süreçlerinde en sık karşılaşılan sorunlar; karakter kodlama (encoding) hataları, yabancı anahtar (foreign key) kısıtlamaları ve yetki sorunlarıdır. UTF-8 karakter setini her iki tarafta da kullandığınızdan emin olun.

  • Karakter Sorunları: Veritabanı bağlantı ayarlarında charset=utf8mb4 kullanıldığından emin olun.
  • Foreign Key Hataları: Veri aktarırken kısıtlamaları geçici olarak devre dışı bırakmak, bağımlılık hatalarını önleyebilir.
  • Zaman Aşımı: Çok büyük verilerde 'timeout' süresini artırın veya veriyi parça parça (batch) aktarın.

Sıkça Sorulan Sorular

Veri taşıma sırasında veritabanını kapatmalı mıyım?

Küçük projelerde veritabanını 'read-only' moduna alarak tutarlılığı garanti edebilirsiniz. Ancak yüksek trafikli sistemlerde 'online migration' yöntemleri tercih edilmelidir.

SQL Injection'dan nasıl korunurum?

Kullanıcıdan alınan verileri sorgulara doğrudan eklemeyin. Daima kütüphanenizin sunduğu 'parameter binding' veya ORM'in sunduğu güvenli sorgu oluşturucuları kullanın.

Migrasyon başarısız olursa ne yapmalıyım?

Önceden aldığınız yedeği kullanarak veritabanını eski haline döndürün. Hata loglarını inceleyerek sorunun kaynağını (syntax hatası, yetki eksikliği vb.) giderin ve süreci tekrarlayın.

Farklı veritabanı sistemleri (MySQL'den PostgreSQL'e) arasında geçiş zor mu?

Evet, her sistemin veri tipi ve SQL lehçesi farklıdır. Bu durumda ETL (Extract, Transform, Load) araçları kullanarak veriyi dönüştürmeniz gerekir.

Migrasyon sonrası indeksleri yeniden oluşturmalı mıyım?

Evet, büyük veri taşımalarından sonra veritabanı performansını optimize etmek için indeksleri yeniden oluşturmak (rebuild) veya istatistikleri güncellemek önerilir.

Büyük Ölçekli Veri Setlerinde Performanslı Taşıma Teknikleri

Veri setiniz milyonlarca satıra ulaştığında, standart INSERT veya SELECT * sorguları bellek taşmalarına ve veritabanı kilitlenmelerine (lock) neden olabilir. Bu durumu yönetmek için "Batch Processing" (yığın işleme) yöntemini kullanmak zorunludur.

Batch (Yığın) İşleme ile Veri Aktarımı

Verileri parçalar halinde taşımak, hem sunucu üzerindeki yükü dengeler hem de işlemin yarıda kesilmesi durumunda kaldığınız yerden devam edebilmenize olanak tanır. Aşağıdaki Python örneği, büyük bir tabloyu 5000'lik bloklar halinde nasıl taşıyabileceğinizi göstermektedir:

import psycopg2

def migrate_in_batches(source_conn, target_conn, batch_size=5000):
    source_cursor = source_conn.cursor()
    target_cursor = target_conn.cursor()
    
    source_cursor.execute("SELECT * FROM large_table")
    
    while True:
        rows = source_cursor.fetchmany(batch_size)
        if not rows:
            break
            
        # Veriyi hedef tabloya ekle
        args = ','.join(target_cursor.mogrify("(%s,%s,%s)", row).decode('utf-8') for row in rows)
        target_cursor.execute(f"INSERT INTO target_table VALUES {args}")
        target_conn.commit()
        print(f"{len(rows)} satır başarıyla taşındı.")

# Bağlantı nesneleri oluşturulduktan sonra fonksiyonu çağırın
migrate_in_batches(src_db, tgt_db)

Veri Taşıma Sürecinde İleri Hata Ayıklama ve Loglama

Migrasyon sırasında oluşan hataları takip etmek, sürecin başarısı için kritiktir. Sadece hata mesajlarını değil, aynı zamanda hangi satırda hata oluştuğunu da kaydeden bir mekanizma kurmalısınız.

Hata Yakalama ve "Dead Letter" Tablosu

Taşıyamadığınız verileri kaybetmemek için bunları bir "Dead Letter" (Hatalı Veri) tablosunda tutmak, daha sonra manuel müdahale yapmanızı kolaylaştırır.

Hata Türü Neden Çözüm
Data Truncation Hedef sütun boyutu yetersiz Hedef şemayı ALTER TABLE ile genişletin
Constraint Violation Yabancı anahtar (FK) kısıtlaması Taşıma sırasında kısıtlamaları geçici olarak devre dışı bırakın
Encoding Error Karakter seti uyumsuzluğu Veriyi UTF-8 formatına normalize edin

Aşağıdaki SQL bloğu, taşıma öncesi kısıtlamaları devre dışı bırakıp, işlem sonrası tekrar aktif etmenizi sağlayan güvenli bir şablon sunar:

-- Taşıma öncesi kısıtlamaları kapat
SET session_replication_role = 'replica';

-- Veri taşıma işlemlerini gerçekleştir
-- ...

-- Taşıma sonrası kısıtlamaları aç
SET session_replication_role = 'origin';

-- İndeksleri ve kısıtlamaları doğrula
ALTER TABLE target_table VALIDATE CONSTRAINT fk_user_id;

Bu yöntem, özellikle büyük veritabanlarında indekslerin her satır eklemesinde güncellenmesini engelleyerek taşıma hızını %40'a kadar artırabilir. Ancak, bu yöntemi kullanırken veritabanı bütünlüğünü korumak için taşıma sonrası mutlaka VALIDATE komutlarını çalıştırmayı unutmayın.

Sonuç

SQL ve veritabanı ile uygulamalar için veri taşıma ve migrasyon, dikkat ve planlama gerektiren teknik bir süreçtir. Doğru araçları seçmek, yedekleme stratejilerini uygulamak ve her aşamada veri doğrulaması yapmak, sisteminizin güvenliğini ve performansını korumanızı sağlar. 2026 yılındaki güncel pratikleri takip ederek, veritabanı geçişlerinizi sorunsuz bir şekilde gerçekleştirebilirsiniz. Bir sonraki adım olarak, veritabanı performans analizi ve sorgu optimizasyonu tekniklerini inceleyerek sisteminizi daha verimli hale getirebilirsiniz.

Sorumluluk Reddi: Bu makalede yer alan kod örnekleri ve yöntemler genel eğitim amaçlıdır. Üretim ortamında (production) yapılacak herhangi bir değişiklikten önce mutlaka yedek alınmalı ve işlemler kontrollü bir ortamda test edilmelidir. Veritabanı güvenliği ve veri kaybı sorumluluğu uygulayıcıya aittir.

Bu yazıya tepkinizi paylaşın:
Mert Özdemir

Teknoloji ve dijital dünyadaki karmaşık süreçleri adım adım rehberlerle sadeleştiriyorum. Kullanıcıların dijital araçlardan en yüksek verimi alması için anlaşılır ve öğretici içerikler yazıyorum.

Yorumlar (0)

Yorum Yaz