Backup Stratejileri: Veritabanı ve Dosya Yedekleme
Neden Yedekleme Stratejisi Şarttır?
Veri kaybı, bir sistem yöneticisinin veya geliştiricinin başına gelebilecek en yıkıcı olaylardan biridir. Donanım arızaları, insan hataları, ransomware saldırıları veya doğal afetler gibi pek çok farklı senaryo, kritik verilerinizi bir anda yok edebilir. Bu nedenle sağlam bir yedekleme stratejisi oluşturmak, her ölçekteki proje için zorunluluktur. "Yedekleme yapmayan değil, yedeklemesini test etmeyen kaybeder" sözünü asla unutmayın.
Yedekleme Türleri
1. Tam Yedekleme (Full Backup)
Tüm verilerin eksiksiz bir kopyasının alınmasıdır. Geri yükleme süresi en kısa olan yöntemdir ancak en fazla disk alanı ve zaman gerektirir. Haftalık tam yedekleme alıp aradaki günleri artımlı yedeklerle doldurmak yaygın bir pratiktir.
2. Artımlı Yedekleme (Incremental Backup)
Sadece son yedeklemeden bu yana değişen verileri kopyalar. Depolama alanından büyük ölçüde tasarruf sağlar, ancak geri yükleme sırasında tam yedek + tüm artımlı yedeklerin sırasıyla uygulanması gerekir.
3. Diferansiyel Yedekleme (Differential Backup)
Son tam yedeklemeden bu yana değişen tüm verileri kopyalar. Artımlı yedeklemeye göre daha fazla alan kullanır, ancak geri yükleme daha hızlıdır çünkü yalnızca tam yedek + son diferansiyel yedek yeterlidir.
Veritabanı Yedekleme Stratejileri
MySQL / MariaDB Yedekleme
MySQL için en yaygın araç mysqldump komutudur. Küçük ve orta ölçekli veritabanları için ideal bir çözüm sunar:
# Tek bir veritabanını yedekleme
mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb_$(date +%Y%m%d_%H%M%S).sql
# Tüm veritabanlarını yedekleme
mysqldump -u root -p --all-databases --single-transaction > all_databases_$(date +%Y%m%d).sql
# Sıkıştırılmış yedekleme (büyük veritabanları için)
mysqldump -u root -p --single-transaction mydb | gzip > mydb_$(date +%Y%m%d).sql.gz
--single-transaction parametresi InnoDB tabloları için kilit kullanmadan tutarlı bir yedek almanızı sağlar. Büyük veritabanlarında (50 GB+) xtrabackup veya mariabackup gibi fiziksel yedekleme araçlarını tercih edin; bu araçlar sıcak yedekleme (hot backup) yapabilir ve artımlı yedeklemeyi destekler:
# Xtrabackup ile tam yedekleme
xtrabackup --backup --target-dir=/backup/full/ --user=root --password=secret
# Xtrabackup ile artımlı yedekleme
xtrabackup --backup --target-dir=/backup/inc1/ --incremental-basedir=/backup/full/ --user=root --password=secret
PostgreSQL Yedekleme
PostgreSQL, yedekleme konusunda güçlü yerleşik araçlar sunar:
# pg_dump ile mantıksal yedekleme
pg_dump -U postgres -Fc -f mydb_$(date +%Y%m%d).dump mydb
# Paralel yedekleme (büyük veritabanları için hız artışı)
pg_dump -U postgres -Fd -j 4 -f /backup/mydb_dir mydb
# Geri yükleme
pg_restore -U postgres -d mydb_restored -j 4 /backup/mydb_dir
Üretim ortamları için WAL (Write-Ahead Log) arşivleme ile sürekli yedekleme (continuous archiving) kurmanız önemle tavsiye edilir. Bu yöntem, belirli bir zaman noktasına geri dönüş (Point-in-Time Recovery - PITR) yapmanıza olanak tanır:
# postgresql.conf ayarları
archive_mode = on
archive_command = 'cp %p /backup/wal_archive/%f'
wal_level = replica
Ayrıca pgBackRest veya Barman gibi araçlar, WAL yönetimi, artımlı yedekleme, paralel sıkıştırma ve S3 uyumlu uzak depolamayı tek bir çatı altında sunar.
MongoDB Yedekleme
NoSQL tarafında MongoDB için mongodump temel yedekleme aracıdır:
# Tüm veritabanlarını yedekleme
mongodump --uri="mongodb://localhost:27017" --out=/backup/mongo_$(date +%Y%m%d)
# Belirli bir koleksiyonu yedekleme
mongodump --db=myapp --collection=users --gzip --archive=/backup/users.gz
# Geri yükleme
mongorestore --gzip --archive=/backup/users.gz --db=myapp
Dosya Sistemi Yedekleme Stratejileri
rsync ile Akıllı Yedekleme
rsync, dosya yedeklemenin vazgeçilmez aracıdır. Sadece değişen dosyaları aktardığı için hem bant genişliği hem de zaman tasarrufu sağlar:
# Temel rsync yedekleme
rsync -avz --delete /var/www/ /backup/www/
# Uzak sunucuya SSH üzerinden yedekleme
rsync -avz -e "ssh -p 2222" /var/www/ user@backup-server:/backup/www/
# Belirli dosya türlerini hariç tutma
rsync -avz --exclude='*.log' --exclude='node_modules' --exclude='.cache' /home/app/ /backup/app/
Hardlink Tabanlı Rotasyonlu Yedekleme
rsync'in --link-dest özelliği ile değişmeyen dosyalar için hardlink kullanarak her gün tam yedek görüntüsü oluşturabilirsiniz. Bu yöntem, disk alanını verimli kullanırken her yedek dizininin bağımsız ve eksiksiz bir kopyaya sahip olmasını sağlar:
#!/bin/bash
BACKUP_BASE="/backup/daily"
DATE=$(date +%Y%m%d)
LATEST=$(ls -1d ${BACKUP_BASE}/2* 2>/dev/null | tail -1)
TARGET="${BACKUP_BASE}/${DATE}"
if [ -n "$LATEST" ]; then
rsync -avz --delete --link-dest="$LATEST" /var/www/ "$TARGET/"
else
rsync -avz --delete /var/www/ "$TARGET/"
fi
# 30 günden eski yedekleri temizle
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
Restic ile Modern Yedekleme
Restic, şifreleme, deduplikasyon ve bulut depolama desteği sunan modern bir yedekleme aracıdır:
# Depo oluşturma (S3)
restic -r s3:s3.amazonaws.com/my-backup-bucket init
# Yedekleme
restic -r s3:s3.amazonaws.com/my-backup-bucket backup /var/www /etc
# Eski yedekleri temizleme: son 7 günlük, 4 haftalık, 6 aylık tut
restic -r s3:s3.amazonaws.com/my-backup-bucket forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
3-2-1 Kuralı
Endüstri standardı olan 3-2-1 kuralı, yedekleme stratejinizin temelini oluşturmalıdır:
- 3 kopya: Verinin orijinali dahil en az üç kopyası olmalı
- 2 farklı ortam: Yedekler en az iki farklı depolama ortamında tutulmalı (örneğin yerel disk + bulut)
- 1 offsite: En az bir kopya fiziksel olarak farklı bir lokasyonda olmalı
Otomasyonla Cron Yapılandırması
Yedekleme işlemleri mutlaka otomatikleştirilmelidir. Manuel yedekleme, er ya da geç unutulur:
# crontab -e ile düzenleyin
# Her gece 02:00'de veritabanı yedekleme
0 2 * * * /usr/local/bin/backup_db.sh >> /var/log/backup_db.log 2>&1
# Her gece 03:00'te dosya yedekleme
0 3 * * * /usr/local/bin/backup_files.sh >> /var/log/backup_files.log 2>&1
# Her Pazar 01:00'de tam yedekleme
0 1 * * 0 /usr/local/bin/full_backup.sh >> /var/log/full_backup.log 2>&1
Yedekleme Doğrulama ve İzleme
Yedekleme almak işin sadece yarısıdır. Düzenli olarak geri yükleme testleri yapmak kritik öneme sahiptir:
- Otomatik doğrulama: Yedekleme sonrası dosya boyutu, checksum kontrolü ve veritabanı bütünlük testi çalıştırın
- Periyodik geri yükleme testi: Ayda en az bir kez yedeklerinizi test ortamına geri yükleyerek çalıştığını doğrulayın
- Uyarı sistemi: Yedekleme başarısız olduğunda bildirim gönderen bir izleme mekanizması kurun (örneğin Healthchecks.io, Prometheus, basit bir e-posta scripti)
- Yedekleme raporlaması: Boyut, süre ve başarı durumunu günlük olarak loglayın
#!/bin/bash
# Basit yedekleme doğrulama örneği
BACKUP_FILE="/backup/mydb_$(date +%Y%m%d).sql.gz"
if [ -f "$BACKUP_FILE" ] && [ $(stat -c%s "$BACKUP_FILE") -gt 1000 ]; then
echo "$(date): Yedekleme başarılı - $(du -h $BACKUP_FILE | cut -f1)" >> /var/log/backup_verify.log
curl -fsS --retry 3 https://hc-ping.com/YOUR-UUID-HERE > /dev/null
else
echo "$(date): HATA - Yedekleme dosyası bulunamadı veya çok küçük!" >> /var/log/backup_verify.log
echo "Yedekleme hatası!" | mail -s "ALARM: Yedekleme Başarısız" admin@sirket.com
fi
Güvenlik Hususları
Yedekleme dosyaları da en az üretim verileri kadar korunmalıdır:
- Yedekleme dosyalarını mutlaka şifreleyin (GPG, restic veya rclone crypt ile)
- Yedekleme sunucusuna erişimi minimum yetkiyle sınırlayın
- Bulut depolamada immutable (değiştirilemez) yedekler kullanarak ransomware'e karşı koruma sağlayın (S3 Object Lock, Azure Immutable Blob Storage)
- Yedekleme credential'larını üretim erişim bilgilerinden ayrı tutun
Sonuç
Etkili bir yedekleme stratejisi; doğru araçların seçimi, 3-2-1 kuralının uygulanması, otomasyonun sağlanması ve düzenli geri yükleme testlerinin yapılmasıyla oluşur. Yedekleme, bir felaket yaşandığında değil bugün düşünülmesi gereken bir konudur. Veritabanınızın boyutu ve kritiklik düzeyine göre mantıksal veya fiziksel yedekleme yöntemlerinden uygun olanı seçin, dosya sistemleriniz için rsync veya restic gibi modern araçları kullanın ve her şeyi otomasyon altına alın. Unutmayın: test edilmemiş bir yedek, yedek değildir.