Linux'ta rsync ile yedek alma: sunucudan sunucuya ve zamanlanmış
rsync, iki yer arasında dosyaları eşitleyen, yalnızca değişenleri aktaran bir araçtır. Bu yüzden ilk yedek uzun sürse de sonrakiler saniyeler alır. Yedek stratejinizin temel taşı olabilir: sunucudaki önemli klasörleri her gece başka bir yere kopyalar.
Temel kullanım
rsync -avz /var/www/ [email protected]:/yedekler/www/
Bayraklar: -a izinleri, sahipleri ve zamanları korur, -v yaptığını yazar, -z aktarım sırasında sıkıştırır. Kaynak yoldaki sondaki eğik çizgi önemlidir: /var/www/ klasörün içindekileri, /var/www ise klasörün kendisini de kopyalar. Karışırsa hedefte bir iç içe klasör oluşur.
Önce deneme çalıştırması
Ne yapacağını görmek için -n (dry run) ekleyin; hiçbir dosyaya dokunmaz:
rsync -avzn /var/www/ [email protected]:/yedekler/www/
Silinen dosyaları da eşitlemek: --delete
Kaynakta sildiğiniz dosyanın hedefte de silinmesini isterseniz --delete ekleyin. Dikkat: bu bayrak hedefte kaynakta olmayan her şeyi siler. Yanlış yola yazarsanız hedefteki verilerinizi kaybedersiniz. Önce -n ile deneyin. Ayrıca bu bir "ayna"dır, yedek değildir: kaynakta yanlışlıkla silinen dosya bir sonraki eşitlemede yedekten de silinir. Geçmiş sürümler için tarih klasörlü yedek kullanın (aşağıda).
Parolasız çalıştırma (SSH anahtarı)
Otomatik çalışması için hedef sunucuya anahtarla bağlanmanız gerekir:
ssh-keygen -t ed25519 -f ~/.ssh/yedek_anahtar -N ""
ssh-copy-id -i ~/.ssh/yedek_anahtar.pub [email protected]
rsync -avz -e "ssh -i ~/.ssh/yedek_anahtar" /var/www/ [email protected]:/yedekler/www/
Anahtar parolasız olduğundan dosyayı yalnızca kendi kullanıcınız okuyabilmeli ve hedef sunucudaki kullanıcı yalnızca yedek klasörüne yazabilmelidir. Anahtar ayrıntıları: SSH anahtarı.
Geçmiş sürümleri saklamak
Her gün ayrı klasör oluşturup, değişmeyen dosyaları önceki günle bağlantılı (hardlink) tutmak, az yer harcayarak geçmiş sürümler verir:
BUGUN=$(date +%F)
rsync -az --link-dest=../son -e "ssh -i ~/.ssh/yedek_anahtar" /var/www/ [email protected]:/yedekler/$BUGUN/
ssh -i ~/.ssh/yedek_anahtar [email protected] "ln -sfn /yedekler/$BUGUN /yedekler/son"
Eski günleri periyodik silmeyi unutmayın, aksi halde yedek diski dolar.
Veritabanını ayrıca dökün
Çalışan bir veritabanının dosyalarını rsync ile kopyalamayın; tutarsız çıkar. Önce döküm alın, sonra rsync ile gönderin:
mysqldump --single-transaction --all-databases | gzip > /yedekler/db-$(date +%F).sql.gz
Zamanlamak
Yukarıdaki komutları bir betiğe koyup her gece çalıştırın: cron görevi ekleme. Örneğin her gece 03:30: 30 3 * * * /usr/local/bin/yedek.sh >> /var/log/yedek.log 2>&1. Günlüğe bakıp çalışıp çalışmadığını zaman zaman kontrol edin.
Geri yükleme
Yönü tersine çevirmeniz yeterlidir: rsync -avz [email protected]:/yedekler/www/ /var/www/. Geri yüklemeyi bir kez deneyin; çalışmayan yedek yedek değildir. Daha geniş strateji için 3-2-1 kuralına, panel seçenekleri için yedek makalesine bakın.
Sık sorulanlar
Windows'tan Linux'a rsync yapabilir miyim?
WSL ya da Git Bash içinde rsync çalışır. Windows sunucuda dosya yedeği için ise robocopy kullanabilirsiniz.
rsync çok yavaş.
İlk çalıştırma tüm dosyaları kopyalar. Küçük çok sayıda dosya yavaştır; ağ hızınıza da bağlıdır. --progress ile ilerlemeyi izleyin, sonraki çalışmalar çok daha hızlı olur.
Hedef sunucu kim olabilir?
Başka bir sunucunuz, evdeki bir bilgisayar ya da bir depolama hizmeti. Önemli olan yedeğin kaynakla aynı sunucuda ya da aynı diskte durmamasıdır.
İlgili makaleler
- Yedek nasıl alınır, zamanlanır ve geri yüklenir?
- Yedekleme için 3-2-1 kuralı nedir?
- Zamanlanmış görev (cron) nasıl eklenir?
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!