Sql & Veritabanı İle Veritabanı İçin Otomatik Zamanlanmış Yedekleme Nasıl Yapılır?

Veritabanı İçin Otomatik Zamanlanmış Yedekleme Stratejileri

Modern yazılım geliştirme süreçlerinde, verilerin güvenliği ve sürekliliği en kritik önceliktir. SQL & veritabanı yönetimi kapsamında, veritabanı için otomatik zamanlanmış yedekleme yapmak, olası bir sistem arızası veya veri kaybı durumunda işletmenizin veya uygulamanızın hayatta kalmasını sağlar. Manuel yedekleme süreçleri insan hatasına açık olduğu için, 2026 standartlarında otomasyon artık bir tercih değil, zorunluluktur.

Bu rehberde, SQL Server, PostgreSQL ve MySQL gibi popüler veritabanı yönetim sistemlerinde, işletim sistemi seviyesinde veya veritabanı motoru içerisinde nasıl otomatik yedekleme planlayacağınızı adım adım öğreneceksiniz. Bu içerik, veritabanı yöneticileri, backend geliştiriciler ve sistem mimarları için hazırlanmıştır.

Gereksinimler ve Ön Hazırlık

Otomatik yedekleme mekanizmasını kurmadan önce, ortamınızın bu sürece hazır olduğundan emin olmalısınız. Yedekleme dosyalarının tutulacağı alanın, veritabanı sunucusundan fiziksel veya mantıksal olarak ayrı bir diskte veya bulut depolama biriminde olması en iyi uygulamadır.

  • Sistem Erişimi: Sunucu üzerinde "root" veya "administrator" yetkilerine sahip bir kullanıcı hesabı.
  • Disk Alanı: Yedekleme dosyalarının saklanacağı, veritabanı boyutunun en az 3 katı boş alan.
  • Otomasyon Aracı: Linux sistemlerde cron, Windows sistemlerde Task Scheduler (Görev Zamanlayıcı).
  • Güvenli Bağlantı: Veritabanı bağlantı bilgilerinin (kullanıcı adı/şifre) güvenli bir şekilde saklanması için ortam değişkenleri veya şifreli konfigürasyon dosyaları.

Linux Sistemlerde Cron ile MySQL/MariaDB Yedekleme

Linux tabanlı sunucularda mysqldump komutu, veritabanı yedeği almanın en standart yoludur. Bir shell script dosyası hazırlayarak bu işlemi otomatize edebiliriz. Aşağıdaki kod, veritabanını sıkıştırılmış bir dosya olarak yedekler.

#!/bin/bash
# Yedekleme dizini ve tarih değişkenleri
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
DB_NAME="musteri_veritabani"

# Yedekleme komutu
mysqldump -u yedek_kullanici -p'guclu_sifre' $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME_$DATE.sql.gz

# 7 günden eski yedekleri sil
find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -delete

Yukarıdaki script, musteri_veritabani isimli veritabanını belirtilen dizine yedekler ve 7 günden eski olanları otomatik temizler. Scripti yedekle.sh olarak kaydedin ve chmod +x yedekle.sh ile çalıştırılabilir yapın.

Cron ile Zamanlama Ayarları

Hazırladığımız scriptin düzenli çalışması için crontab dosyasını düzenlememiz gerekir. Bu, işlemin her gün gece saat 03:00'te çalışmasını sağlar.

# Crontab dosyasını açın
crontab -e

# Aşağıdaki satırı ekleyin (Her gün 03:00'te çalıştır)
0 3 * * * /home/kullanici/scripts/yedekle.sh

Bu yapılandırma, sistemin arka planında otomatik olarak yedekleme sürecini tetikler. 0 3 * * * ifadesi, zamanlama dilimini (dakika, saat, gün, ay, hafta günü) temsil eder.

SQL Server (T-SQL) ile Otomatik Yedekleme

Microsoft SQL Server ortamında, "SQL Server Agent" servisi üzerinden "Maintenance Plan" (Bakım Planı) oluşturmak en yaygın yöntemdir. Ancak kod ile yönetmek isterseniz, aşağıdaki T-SQL komutunu bir Job (İş) olarak tanımlayabilirsiniz.

BACKUP DATABASE [SatisDB]
TO DISK = N'D:\Backups\SatisDB_Full.bak'
WITH NOFORMAT, NOINIT, NAME = N'SatisDB-Tam-Yedekleme',
SKIP, NOREWIND, NOUNLOAD, STATS = 10;
GO

Bu komut, SatisDB veritabanının tam yedeğini alır. SQL Server Management Studio (SSMS) üzerinden bu komutu bir "SQL Server Agent Job" içine yerleştirerek zamanlanmış görev haline getirebilirsiniz.

Yedekleme Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
mysqldump / pg_dump Taşınabilir, SQL tabanlı Büyük veritabanlarında yavaş
SQL Agent / Job Entegre, yönetimi kolay Sadece belirli sürümlerde mevcut
Dosya Sistemi Snapshot Çok hızlı Veritabanı tutarlılığı riski

Güvenlik ve Kritik Uyarılar

Dikkat: Veritabanı şifrelerini asla düz metin (plain text) olarak script dosyalarının içine yazmayın. .my.cnf veya benzeri şifreli konfigürasyon dosyaları kullanın. Yedeklerinizi mutlaka sunucu dışında (off-site) bir depolama birimine (S3, Azure Blob, FTP) kopyalayın. Sadece yerel diskte tutulan yedek, sunucu arızasında tamamen kaybolabilir.

PostgreSQL için Otomatik Zamanlanmış Yedekleme

PostgreSQL'de pg_dump kullanarak veritabanı yedeği alırken, bağlantı bilgilerini .pgpass dosyasında saklamak en güvenli yöntemdir. Böylece script içerisinde şifre belirtmenize gerek kalmaz.

# .pgpass dosyasını oluşturun (kullanici:port:db:user:password)
# chmod 600 ~/.pgpass ile izinleri kısıtlayın

# Yedekleme komutu
pg_dump -h localhost -U db_user -F c -b -v -f "/backups/pg_backup_$(date +%F).backup" db_name

-F c parametresi, yedeğin özel bir formatta alınmasını sağlar, bu da daha sonra pg_restore ile seçici geri yükleme yapmanıza olanak tanır.

Sıkça Sorulan Sorular

Yedekleme sırasında veritabanı kilitlenir mi?

Modern veritabanı motorları (InnoDB, PostgreSQL) "online backup" özelliklerine sahiptir. Doğru parametreler kullanıldığında (örneğin --single-transaction), veritabanı çalışmaya devam ederken tutarlı bir yedek alabilirsiniz.

Yedeğin başarılı olduğunu nasıl anlarım?

Yedekleme scriptinizin sonuna, işlemin başarı durumunu kontrol eden bir if bloğu ekleyin ve hata durumunda e-posta veya Slack/Telegram üzerinden bildirim gönderen bir API isteği tetikleyin.

Farklı (Differential) yedekleme nedir?

Tam yedekleme (full backup) tüm veriyi alırken, fark yedekleme sadece son tam yedeklemeden sonra değişen verileri alır. Disk alanından tasarruf sağlar ancak geri yükleme süreci daha karmaşıktır.

Yedekleme dosyalarını şifrelemeli miyim?

Evet, eğer yedekleri bulut ortamına veya üçüncü taraf sunuculara taşıyorsanız, gpg veya benzeri araçlarla yedek dosyasını şifrelemek veri gizliliği açısından zorunludur.

Hangi sıklıkla yedek almalıyım?

Bu, RPO (Recovery Point Objective - Kurtarma Noktası Hedefi) değerinize bağlıdır. Kritik finansal veriler için saatlik, daha az kritik veriler için günlük yedekleme genellikle yeterlidir.

Yedekleme Süreçlerinde Hata Ayıklama ve Log Yönetimi

Otomatik yedekleme sistemleri kurulduktan sonra en büyük zorluk, sessizce başarısız olan görevleri fark etmektir. Bir cron işi veya SQL Agent görevi hata verdiğinde, bunu anında tespit etmek için gelişmiş loglama mekanizmaları kurmalısınız. Her yedekleme scripti, işlemin sonucunu (başarılı veya başarısız) bir log dosyasına yazmalı ve kritik hatalarda sistem yöneticisine bildirim göndermelidir.

Aşağıdaki bash script örneği, yedekleme işleminin sonucunu kontrol eder ve hata durumunda log dosyasına detaylı çıktı yazar:

#!/bin/bash
# Yedekleme ve loglama scripti
BACKUP_DIR="/var/backups/mysql"
LOG_FILE="/var/log/db_backup.log"
DATE=$(date +%Y-%m-%d_%H-%M-%S)

{
    echo "[$DATE] Yedekleme baslatiliyor..."
    mysqldump -u root -p'sifre' veritabani_adi > "$BACKUP_DIR/db_$DATE.sql"
    
    if [ $? -eq 0 ]; then
        echo "[$DATE] Yedekleme basarili: db_$DATE.sql"
    else
        echo "[$DATE] HATA: Yedekleme basarisiz oldu!" >&2
        # Burada mail veya Slack bildirimi tetiklenebilir
    fi
} >> "$LOG_FILE" 2>&1

Yedekleme Performansını Optimize Etme

Büyük veritabanlarında yedekleme süreci, sistem kaynaklarını (CPU, I/O ve RAM) yoğun bir şekilde kullanır. Bu durum, canlı sistemin performansını olumsuz etkileyebilir. Yedekleme stratejinizi optimize etmek için aşağıdaki yöntemleri uygulayabilirsiniz:

  • I/O Sınırlama: ionice komutunu kullanarak yedekleme işleminin disk üzerindeki önceliğini düşürebilirsiniz. Bu, veritabanı okuma işlemlerinin sistemin genel performansını yavaşlatmasını engeller.
  • Sıkıştırma Algoritmaları: gzip yerine daha hızlı olan lz4 veya zstd gibi sıkıştırma araçlarını kullanarak yedekleme süresini ve disk kullanımını optimize edebilirsiniz.
  • Paralel Yedekleme: Çok büyük veritabanlarında mydumper gibi araçlar kullanarak verileri parçalara ayırıp paralel olarak yedek alabilirsiniz.

Aşağıda ionice kullanarak yedekleme işlemini düşük öncelikli çalıştırma örneği yer almaktadır:

# I/O önceliğini en düşük seviyeye (idle) çekerek yedek al
ionice -c 3 mysqldump -u root -p'sifre' veritabani_adi | gzip > /backups/db_backup.sql.gz

Yedeklerin Otomatik Doğrulanması (Restore Test)

Yedekleme dosyalarınızın sağlam olduğunu garanti etmenin tek yolu, onları düzenli olarak geçici bir veritabanına geri yüklemektir. Bu işlem "Restore Test" olarak adlandırılır ve veritabanı bütünlüğünü doğrulamak için kritik öneme sahiptir. Aşağıdaki mantık, haftalık olarak otomatik bir test süreci yürütmenize yardımcı olur:

  1. Yedek dosyasını geçici bir veritabanı sunucusuna veya aynı sunucuda farklı bir şemaya aktarın.
  2. Geri yükleme işleminin hata verip vermediğini kontrol edin.
  3. Geri yüklenen veritabanında kritik bir tablodan SELECT COUNT(*) sorgusu çalıştırarak verilerin eksiksiz olup olmadığını doğrulayın.
  4. Test sonucunu raporlayın ve geçici veritabanını temizleyin.
Profesyonel İpucu: Yedeklerinizi sadece yerel diskte tutmayın. 3-2-1 kuralını uygulayın: Verilerinizin en az 3 kopyası olsun, 2 farklı medya türünde saklayın ve 1 kopyayı mutlaka farklı bir coğrafi konumda (bulut depolama gibi) bulundurun.

Sonuç

Veritabanı için otomatik zamanlanmış yedekleme kurmak, bir yazılımcının "felaket kurtarma" (disaster recovery) planının temel taşıdır. Bu rehberde öğrendiğiniz yöntemleri, kendi altyapınıza göre özelleştirerek hemen uygulamaya başlayabilirsiniz. Bir sonraki adım olarak, aldığınız yedeklerin otomatik olarak test edilmesini (restore edilip verilerin doğrulanması) sağlayan "otomatik test" mekanizmalarını araştırmanızı öneririm. Unutmayın, geri yüklenemeyen bir yedek, hiç alınmamış bir yedekle aynı değerdedir.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamlarında (production) kullanmadan önce yedekleme scriptlerinizi mutlaka test ortamında çalıştırın, veritabanı izinlerini kontrol edin ve güvenlik protokollerinizi gözden geçirin. Veri kaybı riskine karşı tüm sorumluluk kullanıcıya aittir.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Yaratıcı problem çözme teknikleri üzerine odaklanan bir içerik editörüyüm. Hayatı pratikleştiren tüyolarla okuyucuya zaman kazandırmayı hedefleyen yazılar kurguluyorum.

Yorumlar (0)

Yorum Yaz