tar ile Artımlı Yedekleme Nasıl Yapılır

Yedekleme stratejileri söz konusu olduğunda çoğu sysadmin tam yedekleme (full backup) ile işe başlar. Mantıklı da görünür başta: her şeyi al, bir yere koy, gerekirse geri döndür. Ama production ortamında 500 GB veri varsa ve bunu her gece yedekliyorsan, hem disk alanın eriyip gider hem de yedekleme penceren sabaha kadar uzar. İşte tam bu noktada artımlı yedekleme devreye girer ve tar komutu, bu işi yapmak için düşündüğünden çok daha güçlü araçlar sunar.

Artımlı Yedekleme Nedir?

Artımlı yedekleme (incremental backup), son yedeklemeden bu yana değişen ya da yeni eklenen dosyaları yedekleyen bir yaklaşımdır. İlk çalıştırmada tam yedekleme yapılır, sonraki çalıştırmalarda yalnızca değişiklikler alınır.

Bunu şöyle düşün: Bir ofis arşivleyicisi ilk gün tüm klasörleri kopyalar. Ertesi gün sadece değiştirilen ya da eklenen belgeleri kopyalar. Bu sayede hem zaman kazanırsın hem de depolama alanını verimli kullanırsın.

Artımlı yedeklemenin avantajları:

  • Hız: Sadece değişen dosyalar yedeklendiği için işlem süresi kısalır
  • Alan tasarrufu: Her gün tam yedek almak yerine küçük artımlı yedekler saklanır
  • Düşük I/O yükü: Disk ve ağ üzerindeki yük azalır
  • Esneklik: Belirli bir tarihte sistemin durumuna geri dönülebilir

Dezavantajı ise geri yükleme sürecinin biraz daha karmaşık olmasıdır. Önce tam yedek, sonra sırayla artımlı yedekler uygulanmalıdır.

tar’ın Artımlı Yedekleme Mekanizması

tar komutu, artımlı yedekleme için snapshot dosyası (snar dosyası) kullanır. Bu dosya, yedekleme sırasında hangi dosyaların var olduğunu, değiştirilme zamanlarını ve dizin yapısını kaydeder. Bir sonraki çalıştırmada tar, bu snapshot’a bakarak nelerin değiştiğini anlar.

Temel parametreler şunlardır:

  • –listed-incremental=DOSYA: Artımlı yedekleme için snapshot dosyasını belirtir. Dosya yoksa tam yedekleme yapılır, varsa artımlı devam eder
  • –level=0: Seviye 0 yedekleme, yani tam yedekleme anlamına gelir. Snapshot dosyasını sıfırdan oluşturur
  • –level=1: Seviye 1 artımlı yedekleme, son tam yedekten bu yana değişenleri alır
  • -g: --listed-incremental ile aynı işlevi görür, kısa kullanım şeklidir
  • -c: Yeni arşiv oluşturur
  • -z: gzip sıkıştırması uygular
  • -j: bzip2 sıkıştırması uygular
  • -J: xz sıkıştırması uygular
  • -v: Verbose mod, işlem sırasında dosya listesini gösterir
  • -f: Arşiv dosyasının adını belirtir
  • -p: Dosya izinlerini korur
  • –exclude: Belirtilen dizin veya dosyaları dışarıda bırakır

İlk Tam Yedekleme (Level 0)

Her artımlı yedekleme stratejisi bir tam yedekleme ile başlar. Aşağıdaki komut, /home/kullanici dizininin tam yedeğini alır ve bir snapshot dosyası oluşturur:

tar --listed-incremental=/var/backup/snapshot.snar 
    -czpvf /var/backup/yedek-tam-$(date +%Y%m%d).tar.gz 
    /home/kullanici/

Bu komutu çalıştırdıktan sonra /var/backup/ dizininde iki dosya göreceksin:

  • snapshot.snar: Dosya durumu bilgilerini içeren snapshot
  • yedek-tam-20240115.tar.gz: Tam yedek arşivi

Snapshot dosyasının içeriğine merak edip bakmak istersen:

cat /var/backup/snapshot.snar

GNU tar formatında ikili veri içerir, ama ilk satırlarda tarih damgasını görebilirsin. Bu dosyayı asla silme veya düzenleme, artımlı yedekleme zincirinin temeli budur.

Artımlı Yedekleme Alma

Tam yedekten bir gün sonra bazı dosyalar değişti diyelim. Artımlı yedeği almak için aynı snapshot dosyasını kullanırsın:

tar --listed-incremental=/var/backup/snapshot.snar 
    -czpvf /var/backup/yedek-artimli-$(date +%Y%m%d_%H%M).tar.gz 
    /home/kullanici/

tar, snapshot dosyasına bakarak son yedeklemeden bu yana değişen ya da eklenen dosyaları tespit eder ve yalnızca onları arşivler. Sonuç olarak ortaya çıkan dosya tam yedekten çok daha küçük olacaktır.

Önemli bir nokta: Her artımlı yedek çalıştıktan sonra snapshot dosyası güncellenir. Bu, bir sonraki artımlı yedeğin bir öncekine göre değişimleri alacağı anlamına gelir. Yani zincirleme bir artımlı yapı oluşur.

Gerçek Dünya Senaryosu: Web Sunucusu Yedekleme

Diyelim ki bir web sunucusu yönetiyorsun. /var/www/html dizininde web dosyaları, /etc/nginx altında Nginx konfigürasyonları ve /var/log/nginx altında loglar var. Haftanın başında tam yedek, her gece artımlı yedek almak istiyorsun.

Önce yedekleme dizinlerini oluştur:

mkdir -p /backup/webserver/{tam,artimli,snapshots}

Haftalık tam yedekleme scripti (/usr/local/bin/tam-yedek.sh):

#!/bin/bash

TARIH=$(date +%Y%m%d)
YEDEK_DIZIN="/backup/webserver"
SNAPSHOT="${YEDEK_DIZIN}/snapshots/webserver.snar"
LOG_DOSYA="/var/log/yedekleme.log"

# Mevcut snapshot'u yedekle (zinciri bozmamak icin)
if [ -f "${SNAPSHOT}" ]; then
    cp "${SNAPSHOT}" "${SNAPSHOT}.onceki"
fi

# Level 0: Tam yedekleme - snapshot'u sifirlar
tar --listed-incremental="${SNAPSHOT}" 
    --level=0 
    -czpf "${YEDEK_DIZIN}/tam/webserver-tam-${TARIH}.tar.gz" 
    --exclude='/var/www/html/cache' 
    --exclude='/var/log/nginx/*.gz' 
    /var/www/html 
    /etc/nginx 
    2>>"${LOG_DOSYA}"

if [ $? -eq 0 ]; then
    echo "[$(date)] TAM YEDEK BASARILI: webserver-tam-${TARIH}.tar.gz" >> "${LOG_DOSYA}"
else
    echo "[$(date)] TAM YEDEK HATASI!" >> "${LOG_DOSYA}"
    exit 1
fi

Günlük artımlı yedekleme scripti (/usr/local/bin/artimli-yedek.sh):

#!/bin/bash

TARIH=$(date +%Y%m%d_%H%M)
YEDEK_DIZIN="/backup/webserver"
SNAPSHOT="${YEDEK_DIZIN}/snapshots/webserver.snar"
LOG_DOSYA="/var/log/yedekleme.log"

# Snapshot yoksa hata ver
if [ ! -f "${SNAPSHOT}" ]; then
    echo "[$(date)] HATA: Snapshot dosyasi bulunamadi. Once tam yedek alin." >> "${LOG_DOSYA}"
    exit 1
fi

tar --listed-incremental="${SNAPSHOT}" 
    -czpf "${YEDEK_DIZIN}/artimli/webserver-artimli-${TARIH}.tar.gz" 
    --exclude='/var/www/html/cache' 
    --exclude='/var/log/nginx/*.gz' 
    /var/www/html 
    /etc/nginx 
    2>>"${LOG_DOSYA}"

if [ $? -eq 0 ]; then
    BOYUT=$(du -sh "${YEDEK_DIZIN}/artimli/webserver-artimli-${TARIH}.tar.gz" | cut -f1)
    echo "[$(date)] ARTIMLI YEDEK BASARILI: webserver-artimli-${TARIH}.tar.gz (${BOYUT})" >> "${LOG_DOSYA}"
else
    echo "[$(date)] ARTIMLI YEDEK HATASI!" >> "${LOG_DOSYA}"
    exit 1
fi

Bu scriptleri cron’a ekle:

# crontab -e ile ac ve ekle
# Her Pazartesi saat 02:00'da tam yedek
0 2 * * 1 /usr/local/bin/tam-yedek.sh

# Her gece (Pazar haric) saat 03:00'da artimli yedek
0 3 * * 2-7 /usr/local/bin/artimli-yedek.sh

Snapshot Dosyasını Koruma Altına Almak

Artımlı yedekleme zincirinin en kritik parçası snapshot dosyasıdır. Bu dosya bozulur ya da silinirse, artımlı yedekler işe yaramaz. Bu yüzden her tam yedeklemeden önce snapshot’ın bir kopyasını almak iyi bir alışkanlıktır.

Bunun yanı sıra, haftalık tam yedek alırken --level=0 parametresini kullanmak yerine snapshot dosyasını manuel silip yeni bir zincir başlatmak da yaygın bir yaklaşımdır:

# Haftalık tam yedek öncesi snapshot'ı tarihlendirerek yedekle
cp /backup/snapshots/webserver.snar 
   /backup/snapshots/webserver-$(date +%Y%m%d).snar.bak

# Sonra tam yedek al (--level=0 snapshot'u sifirlar)
tar --listed-incremental=/backup/snapshots/webserver.snar 
    --level=0 
    -czpf /backup/tam/full-$(date +%Y%m%d).tar.gz 
    /var/www/html

Geri Yükleme İşlemi

Artımlı yedekten geri yükleme yaparken sıra önemlidir. Önce tam yedek, ardından tarih sırasıyla artımlı yedekler uygulanmalıdır. tar geri yüklemede --listed-incremental parametresine gerek duymaz, bu yalnızca yedekleme aşamasında gereklidir.

# 1. Adim: Tam yedegi geri yukle
tar --listed-incremental=/dev/null 
    -xzpf /backup/tam/webserver-tam-20240115.tar.gz 
    -C /

# 2. Adim: Artimli yedekleri siraya gore uygula
tar --listed-incremental=/dev/null 
    -xzpf /backup/artimli/webserver-artimli-20240116_0300.tar.gz 
    -C /

tar --listed-incremental=/dev/null 
    -xzpf /backup/artimli/webserver-artimli-20240117_0300.tar.gz 
    -C /

Burada /dev/null kullanımı önemli: geri yükleme sırasında snapshot dosyası yazmak istemiyoruz, sadece okuma modunda davranmasını istiyoruz. Bu sayede geri yükleme işlemi mevcut yedekleme zincirini bozmaz.

Silinmiş dosyalar hakkında bir not: tar artımlı yedeklemede silinen dosyaları da işaretler. Geri yükleme sırasında bu dosyalar hedef sistemden silinir. Bu davranış genellikle istenen şeydir ama dikkatli olunması gereken bir durumdur.

Artımlı Yedeklerin Boyutunu İzleme

Yedekleme sonrası arşivlerin boyutunu düzenli kontrol etmek, hem depolama planlaması hem de anormal durumları tespit etmek açısından faydalıdır:

# Yedekleme dizinindeki dosyalari boyutlariyla listele
ls -lh /backup/webserver/artimli/ | tail -20

# Son 7 gunun yedeklerinin toplam boyutu
find /backup/webserver/artimli/ -name "*.tar.gz" -mtime -7 
    -exec du -ch {} + | tail -1

# Arsivin icindeki dosya sayisini goster (gercekte ne kadar degisiklik var)
tar --listed-incremental=/dev/null 
    -tzvf /backup/artimli/webserver-artimli-20240117_0300.tar.gz | wc -l

Eğer bir artımlı yedek beklenmedik şekilde büyükse, bu bir şeylerin yanlış gittiğinin işareti olabilir. Belki bir uygulama sürekli log yazıyor, belki cache dizini yedekleme kapsamına girmiş durumda.

Eski Yedekleri Temizleme

Disk alanını yönetmek için eski yedekleri düzenli temizlemek gerekir. Ama dikkatli olmak lazım: aktif bir artımlı zincirin ortasındaki bir dosyayı silersen geri yükleme yapamayabilirsin.

# 30 gunden eski artimli yedekleri sil
find /backup/webserver/artimli/ -name "*.tar.gz" -mtime +30 -delete

# 12 haftadan eski tam yedekleri sil
find /backup/webserver/tam/ -name "*.tar.gz" -mtime +84 -delete

# Eski snapshot yedeklerini temizle (60 gunden eski)
find /backup/webserver/snapshots/ -name "*.snar.bak" -mtime +60 -delete

Temizleme işlemini cron’a da ekleyebilirsin, haftada bir çalışması yeterlidir.

Uzak Sunucuya Artımlı Yedekleme

Yedekleri yerel diskte tutmak yeterli değil, uzak bir sunucuya ya da nesne depolama alanına göndermek gerekir. tar ile ssh kombinasyonu burada oldukça kullanışlıdır:

# Artimli yedegi dogrudan uzak sunucuya gonder
tar --listed-incremental=/backup/snapshots/webserver.snar 
    -czp 
    --exclude='/var/www/html/cache' 
    /var/www/html | 
    ssh [email protected] 
    "cat > /yedekler/webserver-artimli-$(date +%Y%m%d_%H%M).tar.gz"

Ya da önce yerel arşivi oluştur, sonra rsync ile uzağa gönder:

# Once yerel arsivi olustur
tar --listed-incremental=/backup/snapshots/webserver.snar 
    -czpf /backup/gecici/webserver-artimli-$(date +%Y%m%d).tar.gz 
    /var/www/html

# Sonra uzak sunucuya gonder
rsync -avz --remove-source-files 
    /backup/gecici/webserver-artimli-$(date +%Y%m%d).tar.gz 
    [email protected]:/yedekler/artimli/

Sık Yapılan Hatalar

Snapshot dosyasını yedeklememek: Snapshot olmadan artımlı zincir tamamen işlevsiz kalır. Bunu her zaman tam yedeğin yanında sakla.

–level=0 kullanmadan yeni zincir başlatmaya çalışmak: Snapshot dosyasını silip yeni bir tam yedek almak istiyorsan, ya dosyayı sil ya da --level=0 kullan. Aksi halde tar hala artımlı modda çalışır.

Cache ve geçici dizinleri dışlamayı unutmak: /tmp, uygulama cache dizinleri, browser cache’leri artımlı yedeklere girerse hem boyut artar hem de gereksiz değişiklikler takip edilir.

Geri yükleme sırasında sırayı karıştırmak: Artımlı yedekler kronolojik sırayla uygulanmalıdır. Sıra atlanırsa dosya sistemi tutarsız duruma gelir.

Yedekleri hiç test etmemek: Yedek almak yeterli değil. Periyodik olarak test ortamında geri yükleme yapıp sonuçları doğrulamalısın. “Yedek var” ile “yedek çalışıyor” farklı şeylerdir.

Sonuç

tar ile artımlı yedekleme, snapshot dosyası mekanizması sayesinde hem güçlü hem de esnek bir yapı sunar. Karmaşık üçüncü parti araçlara gerek kalmadan, sadece standart Linux araçlarıyla kurumsal düzeyde bir yedekleme stratejisi oluşturabilirsin.

Temel yaklaşım şudur: haftanın başında --level=0 ile tam yedek al, snapshot dosyasını güvenli bir yerde sakla, her gece artımlı yedek al, eski yedekleri otomatik temizle ve en az ayda bir geri yükleme testi yap. Bu döngüyü otomasyona bağlayıp düzenli olarak izlersen, veri kaybı riskini ciddi ölçüde azaltmış olursun.

Son olarak şunu hatırlatmak isterim: en iyi yedekleme stratejisi, geri yükleme senaryoları düşünülerek tasarlanan stratejidir. Sadece “yedek alıyorum” demek yetmez, “bu yedekten kaç saatte geri dönebilirim?” sorusunu da cevaplamak gerekir.

Yorum yapın