Sql & Veritabanı İle Veri Tabanı İçin Çapraz Platform Veri Taşıma Nasıl Yapılır?

Sql & Veritabanı İle Veri Tabanı İçin Çapraz Platform Veri Taşıma Nasıl Yapılır?
Sql & Veritabanı İle Veri Tabanı İçin Çapraz Platform Veri Taşıma Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Çapraz platform veri taşıma işlemini başarıyla gerçekleştirmek için kaynak ve hedef veritabanlarınızın erişilebilir olması gerekir. 2026 yılı standartlarında, veritabanı sürücülerinin güncel olması ve bağlantı protokollerinin (TLS/SSL) yapılandırılmış olması temel gereksinimdir.

  • Kaynak Veritabanı: Verilerin bulunduğu mevcut sistem (Örn: PostgreSQL 16+).
  • Hedef Veritabanı: Verilerin aktarılacağı yeni sistem (Örn: MySQL 9.0+).
  • Araçlar: Veri dönüştürme ve taşıma işlemleri için Python veya Node.js gibi bir ara katman dili, veritabanı sürücüleri (psycopg2, mysql-connector).
  • Yetkilendirme: Her iki veritabanı üzerinde okuma ve yazma (CREATE, INSERT, ALTER) yetkisine sahip kullanıcı bilgileri.
Kritik Uyarı: Veri taşıma işlemlerini asla doğrudan canlı (production) veritabanı üzerinde yapmayın. Önce veritabanının bir yedeğini alın ve taşıma sürecini test ortamında simüle edin.

Adım 1: Veri Şemasının Analizi ve SQL Uyumluluğu

Veri taşımanın ilk adımı, kaynak veritabanındaki tablo yapılarını hedef veritabanına uygun SQL ifadelerine dönüştürmektir. Her veritabanı yönetim sistemi, veri tipleri konusunda farklı standartlara sahip olabilir. Örneğin, PostgreSQL'deki SERIAL tipi, MySQL'de AUTO_INCREMENT olarak karşılık bulur.

Aşağıdaki örnekte, bir tablo yapısının platformlar arası uyumlu hale getirilmesi için kullanılan temel SQL şablonunu görebilirsiniz.

-- Kaynak (PostgreSQL) yapısı
CREATE TABLE kullanicilar (
    id SERIAL PRIMARY KEY,
    ad VARCHAR(50),
    kayit_tarihi TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Hedef (MySQL) için dönüştürülmüş yapı
CREATE TABLE kullanicilar (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ad VARCHAR(50),
    kayit_tarihi DATETIME DEFAULT CURRENT_TIMESTAMP
);

Bu adımda, SERIAL tipinin INT AUTO_INCREMENT ile değiştirildiğine dikkat edin. Veri tipi eşleşmelerini bir tablo üzerinde planlamak, taşıma sırasında yaşanacak hataları minimize eder.

Adım 2: Verileri Çıkarma (Export) Süreci

Verileri kaynak veritabanından güvenli bir şekilde çıkarmak için genellikle CSV veya JSON formatları tercih edilir. Bu formatlar, farklı veritabanı platformları arasında "ortak dil" görevi görür. Python kullanarak verileri güvenli bir şekilde bir CSV dosyasına çekelim.

import psycopg2
import csv

# Veritabanı bağlantısı
conn = psycopg2.connect("dbname=kaynak_db user=admin password=sifre")
cur = conn.cursor()

# Veriyi sorgula
cur.execute("SELECT id, ad, kayit_tarihi FROM kullanicilar")
rows = cur.fetchall()

# CSV dosyasına yaz
with open('data_export.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['id', 'ad', 'kayit_tarihi'])
    writer.writerows(rows)

cur.close()
conn.close()

Bu kod bloğu, verileri veritabanından satır satır çeker ve bellek yönetimi için optimize edilmiş bir şekilde dosyaya yazar. Büyük veri setlerinde fetchall() yerine fetchmany() kullanmak performansı artırır.

Adım 3: Veri Dönüştürme ve Temizleme

Farklı platformlar arasında taşınan veriler bazen karakter kodlaması (UTF-8 vs Latin1) veya tarih formatı farklılıkları nedeniyle bozulabilir. Veriyi hedef sisteme yüklemeden önce mutlaka temizlemelisiniz.

Aşağıdaki örnek, tarih formatını hedef sistemin beklediği formata göre düzenleyen bir Python fonksiyonunu göstermektedir.

from datetime import datetime

def format_tarih(tarih_str):
    # ISO formatına dönüştürme
    dt = datetime.strptime(tarih_str, '%Y-%m-%d %H:%M:%S')
    return dt.strftime('%Y-%m-%d %H:%M:%S')

# Örnek kullanım
eski_tarih = "2026-05-12 14:30:00"
yeni_tarih = format_tarih(eski_tarih)
print(f"Dönüştürülen Tarih: {yeni_tarih}")

Adım 4: Verileri Hedef Veritabanına Yükleme (Import)

Veriler temizlendikten sonra, hedef veritabanına yükleme aşamasına geçilir. Burada SQL Injection saldırılarına karşı parametreli sorgular kullanmak zorunludur. Asla kullanıcıdan gelen veriyi doğrudan SQL sorgusuna birleştirmeyin.

import mysql.connector

# Hedef veritabanı bağlantısı
db = mysql.connector.connect(host="localhost", user="root", password="password", database="hedef_db")
cursor = db.cursor()

# Parametreli güvenli ekleme
sql = "INSERT INTO kullanicilar (id, ad, kayit_tarihi) VALUES (%s, %s, %s)"
val = (1, "Ahmet Yılmaz", "2026-05-12 14:30:00")

cursor.execute(sql, val)
db.commit()
print(f"{cursor.rowcount} kayıt eklendi.")

Bu yöntem, veritabanı motorunun SQL komutu ile veriyi birbirinden ayırmasını sağlar, böylece kötü niyetli kodların çalıştırılması engellenmiş olur.

Platform Karşılaştırma Tablosu

Özellik PostgreSQL MySQL SQLite
Otomatik Artan SERIAL AUTO_INCREMENT AUTOINCREMENT
Tarih Tipi TIMESTAMP DATETIME TEXT/NUMERIC
Taşıma Zorluğu Orta Kolay Çok Kolay

Adım 5: Veri Bütünlüğü Testi

Taşıma işleminin ardından, kaynak ve hedef veritabanlarındaki kayıt sayılarını ve veri örneklerini karşılaştırarak sürecin doğruluğunu teyit etmelisiniz. Aşağıdaki sorgu, her iki taraftaki kayıt sayısının eşleşip eşleşmediğini kontrol etmek için kullanılabilir.

-- Kayıt sayısı kontrolü
SELECT COUNT(*) FROM kullanicilar;

Eğer sayı uyuşmuyorsa, log kayıtlarını inceleyerek hangi satırların aktarılamadığını (örneğin kısıt ihlalleri - constraint violations) tespit etmeniz gerekir.

Güvenlik Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Canlı sistemlerde kullanmadan önce veritabanı kimlik bilgilerini (password) ortam değişkenlerinde (environment variables) saklayın ve asla kod içerisinde açıkça yazmayın. SQL Injection ve diğer güvenlik risklerine karşı her zaman güncel kütüphaneler kullanın.

Sıkça Sorulan Sorular

Veritabanı taşıma sırasında veri kaybını nasıl önlerim?

Veri kaybını önlemek için her adımda işlem (transaction) yönetimini kullanın. Hata oluştuğunda ROLLBACK komutu ile veritabanını önceki kararlı haline döndürün.

Büyük veritabanlarında taşıma süreci nasıl hızlandırılır?

Büyük veritabanlarında veriyi parçalara bölerek (chunking) aktarın. Ayrıca, verileri aktarırken indeksleri geçici olarak devre dışı bırakmak ve aktarım bittikten sonra tekrar oluşturmak süreci ciddi oranda hızlandırır.

Farklı karakter setleri (Collation) sorun yaratır mı?

Evet, özellikle Türkçe karakterler (ç, ğ, ı, ö, ş, ü) için utf8mb4 kodlamasını her iki tarafta da kullanmak, veri bozulmalarını engellemek için en iyi pratiktir.

Veritabanı şeması otomatik dönüştürülebilir mi?

Evet, pgloader veya DBeaver gibi araçlar şema dönüştürme işlemini büyük oranda otomatize edebilir. Ancak karmaşık stored procedure veya trigger yapıları için manuel müdahale gerekebilir.

Taşıma sonrası veritabanı optimizasyonu gerekli mi?

Kesinlikle gereklidir. Yeni platformun mimarisi farklı olduğu için ANALYZE veya OPTIMIZE TABLE komutlarını çalıştırarak sorgu planlayıcısının en verimli yolu bulmasını sağlamalısınız.

Veritabanı Taşıma Sürecinde Karşılaşılan Yaygın Hatalar ve Hata Ayıklama (Debugging)

Çapraz platform veri taşıma süreçlerinde, özellikle farklı SQL lehçeleri (örneğin MySQL'den PostgreSQL'e geçiş) arasında veri aktarırken beklenmedik hatalarla karşılaşmak kaçınılmazdır. Bu hataları hızlıca tespit edip çözmek için izlemeniz gereken stratejiler şunlardır:

Yaygın Hata Türleri ve Çözüm Yolları

  • Veri Tipi Uyuşmazlıkları: Hedef veritabanında karşılığı olmayan veri tipleri (örneğin TINYINT veya özel ENUM yapıları) hata verir. Bu durumda veriyi VARCHAR veya INTEGER formatına cast etmeniz gerekebilir.
  • Kısıtlamalar (Constraints) ve Foreign Key Hataları: Veri aktarımı sırasında tablo bağımlılıkları nedeniyle "Foreign Key Violation" hataları alırsınız. Çözüm, aktarım sırasında kısıtlamaları geçici olarak devre dışı bırakmaktır.
  • Karakter Kodlama Hataları: Kaynak veritabanındaki UTF8MB4 karakterlerin hedefte LATIN1 ile çakışması veri bozulmalarına yol açar. Bağlantı string'inizde mutlaka karakter seti tanımlaması yapın.

Hata Ayıklama İçin SQL İzleme Scripti

Taşıma sırasında hangi satırın hata verdiğini bulmak için bir loglama mekanizması kurmalısınız. Aşağıdaki örnek, MySQL üzerinde hata veren satırları tespit etmek için basit bir kontrol mantığı sunar:

-- Hata ayıklama için geçici bir tablo oluşturun
CREATE TABLE migration_errors (
    id INT AUTO_INCREMENT PRIMARY KEY,
    table_name VARCHAR(255),
    error_message TEXT,
    failed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Veri aktarımı sırasında hata oluştuğunda tetiklenecek mantık (Örnek)
DELIMITER //
CREATE PROCEDURE SafeImport()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        INSERT INTO migration_errors (table_name, error_message) 
        VALUES ('users_table', 'Veri tipi uyumsuzluğu veya kısıtlama hatası');
    END;
    -- Aktarım sorgunuz buraya gelecek
    INSERT INTO target_db.users SELECT * FROM source_db.users;
END //
DELIMITER ;

Veritabanı Migrasyonlarında İleri Seviye Otomasyon: Liquibase Kullanımı

Manuel taşıma süreçleri hata yapmaya çok müsaittir. Profesyonel projelerde veritabanı şemasını sürüm kontrol sistemine (Git gibi) dahil etmek için Liquibase veya Flyway gibi araçlar kullanılır. Bu araçlar, veritabanı değişikliklerini "ChangeLog" dosyaları üzerinden yönetmenizi sağlar.

Liquibase ile XML/YAML Tabanlı Şema Yönetimi

Liquibase, veritabanı yapınızı kod olarak tanımlamanıza olanak tanır. Bu sayede bir platformdan diğerine geçiş yaparken, SQL komutlarını elle yazmak yerine yapılandırma dosyalarını kullanırsınız.

İpucu: Büyük ölçekli veritabanlarında, veriyi parça parça (batch) aktarmak sistem kaynaklarını korur. LIMIT ve OFFSET kullanarak veriyi 10.000'lik paketler halinde taşımak, bellek taşmalarını (memory overflow) engeller.

Taşıma Sonrası Doğrulama Kontrol Listesi

  1. Satır Sayısı Kontrolü: SELECT COUNT(*) sorgusu ile kaynak ve hedef tablolardaki kayıt sayılarını karşılaştırın.
  2. Checksum Doğrulaması: Kritik tablolarda verilerin birebir aynı olup olmadığını anlamak için MD5 veya SHA2 fonksiyonlarını kullanarak satır bazlı özet (hash) karşılaştırması yapın.
  3. İndeks Kontrolü: Taşıma sonrası indekslerin (index) oluşup oluşmadığını SHOW INDEX FROM table_name; komutu ile doğrulayın. Eksik indeksler, uygulama performansını ciddi oranda düşürecektir.

Sonuç

Sql & veritabanı ile veri tabanı için çapraz platform veri taşıma, disiplinli bir planlama ve doğru araç kullanımı gerektiren bir süreçtir. Şema analizi, güvenli veri aktarımı ve sonrasında yapılan bütünlük testleri, geçişin başarısını belirleyen temel unsurlardır. Bu rehberde öğrendiğiniz yöntemleri küçük ölçekli projelerde uygulayarak pratik yapabilir, ardından daha karmaşık veritabanı yapılarına geçiş yapabilirsiniz. Bir sonraki adım olarak, veritabanı migrasyonlarını otomatize eden Flyway veya Liquibase gibi araçları inceleyerek süreçlerinizi profesyonel seviyeye taşıyabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik beceriler ve bakım onarım rehberleri konusunda deneyimli bir editörüm. Okuyucularıma günlük hayatta tasarruf sağlayacak ipuçları sunuyorum.

Yorumlar (0)

Yorum Yaz