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

Ön Hazırlık ve Gereksinimler

Otomatik yedekleme sistemini kurmadan önce çalışma ortamınızın hazır olduğundan emin olmalısınız. Bu rehberde genel olarak PostgreSQL ve MySQL (MariaDB) sistemleri üzerinden örnekler verilecektir. İhtiyacınız olan temel bileşenler şunlardır:

  • Erişim Yetkisi: Veritabanı üzerinde 'dump' (yedek alma) yetkisine sahip bir kullanıcı.
  • Depolama Alanı: Yedek dosyalarının saklanacağı güvenli bir dizin veya uzak sunucu (S3 bucket vb.).
  • Zamanlayıcı: Linux tabanlı sistemlerde cron, Windows sistemlerde ise Task Scheduler.
  • İletişim: Yedekleme sonucunu raporlayacak bir e-posta veya bildirim servisi.

Adım 1: Veritabanı Yedeği Alma Komutlarını Tanıma

Otomasyonun ilk adımı, terminal üzerinden çalışan ve veritabanını bir dosyaya aktaran komutları doğru yapılandırmaktır. MySQL için mysqldump, PostgreSQL için ise pg_dump standart araçtır.

Aşağıdaki örnekte, bir MySQL veritabanını sıkıştırılmış bir .sql dosyası olarak dışa aktaran temel komutu görebilirsiniz:

# MySQL için yedek alma komutu
mysqldump -u kullanici_adi -p'sifre' veritabani_adi | gzip > /yedekler/db_yedek_$(date +%F).sql.gz

Bu komut, veritabanını dışa aktarır, gzip ile sıkıştırır ve günün tarihini dosya ismine ekleyerek belirtilen dizine kaydeder. Güvenlik nedeniyle şifreyi doğrudan komut satırında yazmak yerine .my.cnf gibi yapılandırma dosyalarını kullanmanızı öneririz.

Adım 2: Güvenli Yedekleme İçin Kimlik Bilgilerini Yönetme

Kod içerisinde veya cron dosyasında şifreleri açık metin olarak tutmak büyük bir güvenlik açığıdır. Bunun yerine, veritabanı kimlik bilgilerini içeren kısıtlı yetkiye sahip bir yapılandırma dosyası oluşturmalıyız.

Aşağıdaki örnekte, MySQL için güvenli bir yapılandırma dosyası içeriği yer almaktadır:

# ~/.my.cnf dosyası içeriği
[client]
user=yedekleme_kullanicisi
password=cok_guclu_bir_sifre
host=localhost

Bu dosyayı oluşturduktan sonra, sadece sahibi tarafından okunabilir olması için izinlerini chmod 600 ~/.my.cnf komutuyla kısıtlamanız kritiktir. Bu sayede sunucudaki diğer kullanıcılar şifrenizi göremez.

Adım 3: Cron ile Zamanlanmış Görev Oluşturma

Yedekleme işlemini otomatize etmek için Linux sistemlerde cron kullanılır. crontab -e komutunu kullanarak zamanlayıcıyı düzenleyebiliriz. Örneğin, her gün gece saat 03:00'te yedek alacak bir görev tanımlayalım.

# Her gün saat 03:00'te yedek al
0 3 * * * /usr/bin/bash /scripts/yedekle.sh

Bu satır, sistemin her gün saat 03:00'te belirtilen yedekle.sh dosyasını çalıştırmasını sağlar. Yedekleme script'inizin içine hata loglarını yakalayacak mekanizmalar eklemek, sistemin çalışıp çalışmadığını takip etmenizi kolaylaştırır.

Adım 4: Yedekleme Script'i Geliştirme

Sadece komut çalıştırmak yetmez; aynı zamanda eski yedekleri temizlemek ve işlem sonucunu raporlamak gerekir. Aşağıdaki örnek bash script'i, yedekleme sürecini yönetir.

#!/bin/bash
# Yedekleme dizini ve tarih
YEDEK_DIZINI="/var/backups/db"
TARIH=$(date +%Y-%m-%d)

# Yedek al
mysqldump -u yedek_user veritabani_adi | gzip > $YEDEK_DIZINI/db_$TARIH.sql.gz

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

Bu script, 7 günden eski yedekleri otomatik olarak temizleyerek disk alanınızın dolmasını engeller. Bu, üretim ortamlarında disk yönetimi için en önemli adımdır.

Adım 5: Yedekleme Yöntemlerinin Karşılaştırılması

Veritabanı yedekleme stratejileri kullanım amacına göre değişiklik gösterir. Aşağıdaki tablo, farklı yedekleme yöntemlerinin avantaj ve dezavantajlarını özetlemektedir.

Yöntem Avantaj Dezavantaj
Mantıksal Yedekleme (Dump) Taşınabilir, sürüm bağımsız Büyük verilerde yavaş geri yükleme
Fiziksel Yedekleme (Snapshot) Çok hızlı geri yükleme Donanım/Sürüm bağımlılığı
Artımlı (Incremental) Daha az disk alanı kullanımı Geri yükleme süreci karmaşık

Adım 6: Güvenlik ve Test Süreçleri

Kritik Uyarı: Yedekleme dosyalarınızın güvenliği, veritabanınızın güvenliği kadar önemlidir. Yedek dosyalarını şifrelemeden (GPG vb. ile) bulut depolama alanlarına göndermeyin. Ayrıca, düzenli olarak "yedek geri yükleme" testi yapmayan bir sistem, aslında yedeklenmiyor demektir.

Yedeğin çalıştığını doğrulamak için periyodik olarak bir test sunucusuna geri yükleme yapmalısınız. Aşağıdaki komut, bir SQL dosyasını veritabanına geri yüklemek için kullanılır:

# Yedek dosyasını geri yükleme
gunzip < db_yedek_2026-05-20.sql.gz | mysql -u kullanici_adi -p veritabani_adi

Bu işlem, yedeğin hasarsız olduğunu ve verilerin tutarlı bir şekilde dışa aktarıldığını kanıtlar.

Sıkça Sorulan Sorular

Yedekleme sırasında veritabanı kilitlenir mi?

mysqldump kullanırken --single-transaction parametresini ekleyerek InnoDB tabloları için kilitlenmeden (lock-free) yedek alabilirsiniz. Bu, canlı sistemlerde kesintisiz yedekleme sağlar.

Yedeklerimi nerede saklamalıyım?

Yedekleri veritabanının bulunduğu sunucuda saklamak, bir donanım arızasında tüm veriyi kaybetmenize neden olur. Yedekleri mutlaka farklı bir coğrafi bölgedeki bir sunucuya veya S3 gibi bir bulut depolama servisine aktarmalısınız.

Otomatik yedekleme başarısız olursa nasıl anlarım?

Script'inizin sonuna bir bildirim mekanizması ekleyin. Örneğin, curl kullanarak bir Slack webhook'una veya basit bir mail komutu ile e-posta adresinize hata durumunda bildirim gönderebilirsiniz.

Artımlı (Incremental) yedekleme gerekli mi?

Veritabanınızın boyutu terabaytlar seviyesindeyse, her gün tam yedek almak hem disk hem de ağ trafiği açısından maliyetlidir. Bu durumda veritabanı loglarını (binlog) kullanarak artımlı yedekleme yapmanız önerilir.

Şifreleme neden bu kadar önemli?

Yedek dosyaları, veritabanınızın ham verisini içerir. Eğer bu dosyalar çalınırsa, saldırganlar tüm kullanıcı verilerinize, şifre hash'lerinize ve özel bilgilerinize erişebilir. AES-256 gibi standartlarla dosyaları şifrelemek, verinin çalınması durumunda okunamaz olmasını sağlar.

Yedekleme Stratejilerinde Performans Optimizasyonu

Büyük ölçekli veritabanlarında yedekleme süreci, sunucu kaynaklarını (CPU ve I/O) yoğun bir şekilde tüketebilir. Özellikle canlı sistemlerde yedekleme sırasında performans kaybını minimize etmek için bazı stratejiler izlenmelidir. Veritabanı boyutunuz gigabayt seviyelerini aştığında, standart mysqldump komutu yerine daha verimli yöntemler tercih edilmelidir.

LVM Snapshot ile Kesintisiz Yedekleme

Veritabanını kilitlemeden yedek almanın en etkili yollarından biri, dosya sistemi seviyesinde "snapshot" (anlık görüntü) almaktır. LVM (Logical Volume Manager) kullanarak veritabanı dosyalarınızın o anki durumunu dondurabilir ve yedekleme işlemini bu kopyadan gerçekleştirebilirsiniz.

# LVM snapshot oluşturma
lvcreate -L 10G -s -n db_backup_snap /dev/vg0/mysql_data

# Snapshot'ı mount etme
mount /dev/vg0/db_backup_snap /mnt/backup_temp

# Yedekleme işlemini buradan yapın
tar -czf /yedekler/db_full_$(date +%F).tar.gz /mnt/backup_temp

# Snapshot'ı temizleme
umount /mnt/backup_temp
lvremove /dev/vg0/db_backup_snap

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

Otomatik yedekleme sistemlerinde en kritik nokta, işlemin sessizce başarısız olmasını engellemektir. Bir yedekleme script'inin başarılı olup olmadığını anlamak için sadece çıkış kodlarını (exit codes) değil, aynı zamanda log dosyalarını da takip etmelisiniz.

Bash Script ile Hata İzleme

Script'inizin içerisine hata yakalama mekanizmaları ekleyerek, yedekleme başarısız olduğunda sistem yöneticisine e-posta gönderen veya bir log dosyasına detaylı hata kaydı düşen bir yapı kurabilirsiniz.

#!/bin/bash

BACKUP_DIR="/var/backups/mysql"
LOG_FILE="/var/log/db_backup.log"

{
    echo "[$(date)] Yedekleme başladı."
    mysqldump -u root -p'sifre' veritabani_adi > $BACKUP_DIR/db.sql
    
    if [ $? -eq 0 ]; then
        echo "[$(date)] Yedekleme başarıyla tamamlandı."
    else
        echo "[$(date)] HATA: Yedekleme başarısız oldu!" >&2
        # Buraya bir e-posta bildirim komutu eklenebilir
        exit 1
    fi
} >> $LOG_FILE 2>&1

Bu yapı sayesinde /var/log/db_backup.log dosyasını düzenli olarak kontrol ederek veya grep komutu ile "HATA" kelimesini aratarak sistemin sağlığını anlık olarak izleyebilirsiniz. Ayrıca, cron görevine MAILTO=admin@domain.com değişkenini ekleyerek, script hata verdiğinde sistemin otomatik bildirim göndermesini sağlayabilirsiniz.

Yedekleme Dosyalarının Yaşam Döngüsü Yönetimi

Sunucunuzdaki disk alanının dolmasını engellemek için "Retention Policy" (Saklama Politikası) uygulamak zorunludur. Aşağıdaki komut, 30 günden eski yedek dosyalarını otomatik olarak siler:

# 30 günden eski .sql veya .gz dosyalarını bul ve sil
find /var/backups/mysql/ -type f -name "*.gz" -mtime +30 -exec rm -f {} \;

Bu komutu cron içerisinde haftalık olarak çalıştırarak, yedekleme dizininizin kontrolsüz büyümesini engelleyebilir ve depolama maliyetlerinizi optimize edebilirsiniz.

Sonuç

SQL & veritabanı ile otomatik zamanlanmış yedekleme yapmak, profesyonel bir yazılım geliştirme sürecinin vazgeçilmez bir parçasıdır. Bu rehberde öğrendiğiniz cron kullanımı, mysqldump yapılandırması ve eski yedeklerin temizlenmesi gibi adımlar, sisteminizin dayanıklılığını artıracaktır. Bir sonraki adım olarak, yedekleme dosyalarınızı şifreleyerek uzak bir depolama birimine otomatik gönderen bir "off-site backup" mimarisi kurmayı hedefleyebilirsiniz.

Güvenlik Notu: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Üretim ortamlarında kullanmadan önce mutlaka kendi sistem mimarinize uygun testleri yapın ve veritabanı erişim yetkilerini "en az ayrıcalık" (least privilege) prensibine göre yapılandırın.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Hobi ve kişisel gelişim alanında içerik editörlüğü yapıyorum. Okuyuculara yeni beceriler kazandıran, net ve anlaşılır nasıl yapılır makaleleri yazıyorum.

Yorumlar (0)

Yorum Yaz