CMD ile Robocopy Kullanarak Gelişmiş Dosya Kopyalama ve Yedekleme

Yıllardır Windows ortamlarında çalışan sysadminlerin en çok şikayet ettiği konulardan biri dosya kopyalama ve yedekleme operasyonlarının güvenilirliğidir. Standart xcopy komutu bir süre işe yarasa da büyük miktarda veri, ağ üzerinden kopyalama ve kesintiye uğrayan transferler söz konusu olduğunda yetersiz kalıyor. İşte tam bu noktada Robocopy devreye giriyor. Windows’a yerleşik olarak gelen bu güçlü araç, kurumsal ortamlarda dosya operasyonlarını güvenilir, esnek ve otomatize edilebilir hale getiriyor. Bu yazıda Robocopy’yi derinlemesine inceleyecek, gerçek dünya senaryolarıyla nasıl kullanacağını göstereceğim.

Robocopy Nedir ve Neden Önemlidir

Robocopy, “Robust File Copy” kelimelerinin kısaltmasıdır ve adından da anlaşılacağı üzere sağlam ve güvenilir dosya kopyalama için tasarlanmıştır. Windows Vista’dan itibaren işletim sistemine dahil edilmiş olup Windows Server 2008 ve sonrasında standart araç olarak gelir.

Klasik copy veya xcopy komutlarından farkı şudur: Robocopy bir dosyayı kopyalarken kaynak ve hedef arasındaki farkı analiz eder, başarısız transferleri otomatik olarak yeniden dener, dosya izinlerini ve zaman damgalarını koruyabilir. Bunun yanı sıra ağ kesintilerine karşı dayanıklıdır ve büyük dizin ağaçlarını yönetmek için optimize edilmiştir.

Temel avantajlarını şöyle sıralayabilirim:

  • Yeniden deneme mekanizması: Başarısız kopyalamalar otomatik olarak yeniden denenir
  • Delta kopyalama: Sadece değişen dosyaları kopyalar, tüm veriyi baştan almaz
  • İzin koruma: NTFS izinleri, sahiplik ve audit ayarları taşınabilir
  • Çoklu iş parçacığı: /MT parametresiyle paralel kopyalama yapılabilir
  • Ayrıntılı loglama: Her operasyonun kaydı tutulabilir
  • Mirror modu: Kaynak ve hedefi birebir senkronize eder

Temel Sözdizimi ve Zorunlu Parametreler

Robocopy’nin temel yapısı oldukça basittir:

robocopy <kaynak> <hedef> [dosya_filtresi] [parametreler]

En basit kullanım örneğiyle başlayalım:

robocopy C:Veriler D:Yedek

Bu komut C:Veriler dizinini D:Yedek dizinine kopyalar. Ancak bu kullanım alt dizinleri kopyalamaz. Alt dizinlerle birlikte kopyalamak için:

robocopy C:Veriler D:Yedek /E

/E parametresi boş dizinler dahil tüm alt dizinleri kopyalar. /S ise boş dizinleri hariç tutar. Çoğu senaryoda /E tercih edilir çünkü dizin yapısının korunması önemlidir.

En Sık Kullanılan Parametreler

Robocopy’nin onlarca parametresi vardır ama günlük işlerde sürekli kullandığım parametreler bellidir. Bunları kategorilere göre açıklayayım:

Kopyalama Kapsamı:

  • /E: Boş dizinler dahil tüm alt dizinleri kopyalar
  • /S: Boş dizinleri hariç tutarak alt dizinleri kopyalar
  • /MIR: Mirror modu, kaynağı hedefle birebir eşitler, hedefteki fazladan dosyaları siler
  • /MOV: Dosyaları taşır (kopyaladıktan sonra kaynaktan siler)
  • /MOVE: Tüm dizin ağacını taşır

Kopyalama Seçenekleri:

  • /COPYALL: Tüm dosya bilgilerini kopyalar (veri, özellikler, zaman damgaları, NTFS izinleri, sahiplik, audit)
  • /COPY:DAT: Varsayılan, veri, özellikler ve zaman damgalarını kopyalar
  • /DCOPY:T: Dizin zaman damgalarını kopyalar
  • /SEC: Dosya güvenlik bilgilerini kopyalar (/COPY:DATS ile eşdeğer)
  • /PURGE: Hedefte olmayan kaynak dosyalarını siler

Yeniden Deneme ve Bekleme:

  • /R:n: Başarısız kopyalama için yeniden deneme sayısı (varsayılan 1.000.000)
  • /W:n: Yeniden denemeler arasındaki bekleme süresi saniye cinsinden (varsayılan 30)
  • /TBD: Paylaşım adlarının tanımlanmasını bekler

Performans:

  • /MT:n: Çoklu iş parçacıklı kopyalama, n adet paralel thread (varsayılan 8, max 128)
  • /IPG:n: Paketler arası boşluk, bant genişliği kontrolü için milisaniye

Loglama:

  • /LOG:dosya: Çıktıyı log dosyasına yazar, varsa üzerine yazar
  • /LOG+:dosya: Çıktıyı log dosyasına ekler
  • /TEE: Hem ekrana hem log dosyasına yazar
  • /NP: İlerleme yüzdesini göstermez
  • /NFL: Dosya adlarını loglamaz
  • /NDL: Dizin adlarını loglamaz
  • /NJH: İş başlığını loglamaz
  • /NJS: İş özetini loglamaz

Dosya Filtreleme:

  • /XF: Belirli dosyaları hariç tut (wildcard destekler)
  • /XD: Belirli dizinleri hariç tut
  • /XA:H: Gizli dosyaları hariç tut
  • /IA:A: Sadece arşiv bayrağı set edilmiş dosyaları kopyala
  • /XO: Hedefte daha yeni olan dosyaları atla
  • /MAXAGE:n: n günden eski dosyaları atla
  • /MINAGE:n: n günden yeni dosyaları atla

Gerçek Dünya Senaryosu 1: Günlük Veri Yedeği

Ofis ortamında en yaygın ihtiyaçlardan biri sunucudaki dosya paylaşımlarını başka bir konuma düzenli olarak yedeklemektir. Diyelim ki bir dosya sunucusundaki \FileserverPaylasim dizinini her gece yerel bir yedek diskine ve NAS cihazına kopyalamak istiyorsun.

robocopy \FileserverPaylasim D:YedeklerDosyalar /E /COPYALL /R:3 /W:10 /MT:16 /LOG+:C:Logsyedek_%date:~-4,4%%date:~-7,2%%date:~0,2%.log /TEE /NP

Bu komutta neler yapıyor:

  • \FileserverPaylasim kaynak UNC yolu
  • /E ile boş dizinler dahil tümü kopyalanıyor
  • /COPYALL ile izinler, sahiplik ve diğer tüm özellikler korunuyor
  • /R:3 /W:10 ile başarısız dosyalar 3 kez, 10 saniye arayla yeniden deneniyor
  • /MT:16 ile 16 paralel thread açılıyor, büyük ağlarda hızı ciddi artırıyor
  • /LOG+ ile tarihli log dosyasına ekleme yapılıyor
  • /TEE ile aynı zamanda ekranda da görüntüleniyor

Bu komutu bir .bat dosyasına kaydedip Görev Zamanlayıcı ile her gece 02:00’de çalıştırabilirsin.

Gerçek Dünya Senaryosu 2: Mirror Yedekleme ile Temiz Senkronizasyon

Kaynak dizini hedefle birebir aynı tutmak istiyorsan yani kaynaktan silinen dosyaların hedeften de silinmesini istiyorsan /MIR parametresini kullanmalısın. Bu özellikle arşiv dizinlerini senkronize etmek için çok kullanışlıdır.

robocopy C:WebSite D:MirrorSite /MIR /COPYALL /R:5 /W:5 /LOG:C:Logsmirror_sync.log /TEE /XD .git node_modules /XF *.tmp *.log

Burada /XD .git node_modules ile git deposu ve node modülleri hariç tutulmuş, /XF .tmp .log ile geçici dosyalar ve log dosyaları kopyalanmıyor. Bu tür filtreler hem kopyalama süresini hem de disk kullanımını ciddi ölçüde azaltır.

Dikkat: /MIR parametresi hedef dizindeki fazla dosyaları siler. Yanlış hedef belirtirsen veri kaybı yaşayabilirsin. Her zaman önce /L parametresiyle ne yapacağını simüle et.

robocopy C:WebSite D:MirrorSite /MIR /L

/L parametresi gerçekten hiçbir şey yapmaz, sadece ne yapacağını listeler. Bunu test etmek için mutlaka kullan.

Gerçek Dünya Senaryosu 3: Artımlı Yedekleme

Büyük miktarda verinin tamamını her gün kopyalamak mantıklı değil. Bunun yerine arşiv bayrağını kullanarak sadece değişen dosyaları kopyalayan artımlı yedekleme yapabilirsin.

robocopy C:Veriler D:YedeklerArtimli /E /IA:A /M /R:3 /W:10 /LOG+:C:Logsartimli_yedek.log /TEE

Burada /IA:A sadece arşiv bayrağı set edilmiş dosyaları seçer, /M ise kopyaladıktan sonra arşiv bayrağını temizler. Böylece bir sonraki çalıştırmada sadece o günden sonra değişen dosyalar kopyalanır.

Ancak bu yaklaşımı kullanırken dikkat etmen gereken bir husus var: Hedef dizinde dosyanın son kopyalandığı tarihten önceki versiyonu tutmak istiyorsan her gün için ayrı bir hedef klasör oluşturman gerekir.

@echo off
set TARIH=%date:~-4,4%%date:~-7,2%%date:~0,2%
robocopy C:Veriler D:Yedekler%TARIH% /E /IA:A /M /R:3 /W:10 /LOG+:C:Logsartimli_%TARIH%.log

Bu batch script her çalıştığında o günün tarihi adında yeni bir klasör oluşturur ve sadece değişen dosyaları oraya kopyalar.

Gerçek Dünya Senaryosu 4: Büyük Sunucu Migrasyonu

Sunucu migrasyonları sysadminlerin en çok stres yaşadığı anlardan biridir. Terabaytlarca veriyi taşırken hem hızlı olman hem de hiçbir şeyi atlamaman gerekiyor. Robocopy bu senaryoda çok güçlü bir araç.

Önce test modunda çalıştır:

robocopy \EskiSunucuVeri \YeniSunucuVeri /E /COPYALL /R:3 /W:10 /MT:32 /L /LOG:C:Logsmigrasyon_test.log

Log dosyasını inceleyip tahmini boyutu ve dosya sayısını gördükten sonra gerçek kopyalamayı başlat:

robocopy \EskiSunucuVeri \YeniSunucuVeri /E /COPYALL /R:3 /W:10 /MT:32 /LOG:C:Logsmigrasyon.log /TEE /NP

Migrasyon genellikle çok uzun sürer ve bu süre zarfında kullanıcılar eski sunucuya yazmaya devam eder. Bu yüzden son senkronizasyonu bakım penceresi sırasında yaparsın. Bakım penceresinde eski sunucuyu salt okunur yapıp son değişiklikleri /XO ile senkronize edersin:

robocopy \EskiSunucuVeri \YeniSunucuVeri /E /COPYALL /XO /R:3 /W:5 /MT:32 /LOG:C:Logsson_sync.log /TEE

/XO ile hedefte daha yeni olan dosyalar atlanır, sadece yeni veya güncellenen dosyalar kopyalanır.

Gerçek Dünya Senaryosu 5: Bant Genişliği Kısıtlamalı Yedekleme

Bazı ortamlarda yedekleme ağ trafiği iş saatlerinde ciddi sorunlara yol açabilir. Mesai saatleri dışında bile ağda başka şeyler varsa bant genişliğini kısıtlamak gerekebilir. /IPG parametresi tam bu işe yarar.

robocopy C:Veriler \NASCihaziYedek /E /COPYALL /R:3 /W:10 /IPG:50 /LOG:C:Logsyedek_kisitli.log

/IPG:50 her paket arasında 50 milisaniye bekler. Bu değeri artırdıkça bant genişliği kullanımı düşer. Ancak kopyalama süresi uzar. Genellikle bu parametreyle deneme yanılma yoluyla uygun değeri buluyorum.

Alternatif olarak çok büyük dosya kopyalamalarında /MT değerini düşürmen de bant genişliği kullanımını azaltır.

Robocopy Exit Kodları ve Anlamları

Robocopy diğer komutlardan farklı olarak exit kodu döner ve bu kodlar bit maskesi şeklinde çalışır. Görev Zamanlayıcı veya bir otomasyon sistemi entegrasyonunda bu kodları anlamak kritik önem taşır.

  • 0: Kopyalanacak dosya yoktu, hiçbir şey yapılmadı
  • 1: Dosyalar başarıyla kopyalandı
  • 2: Hedefe fazladan dosya var, kopyalama başarılı
  • 4: Uyumsuz dosyalar var, kopyalama başarılı
  • 8: Bazı dosyalar kopyalanamadı (hata)
  • 16: Kritik hata, hiçbir şey kopyalanamadı

Exit kodu 0, 1, 2 ve 4 başarı sayılır. 8 ve üzeri hata anlamına gelir. Batch scriptlerde bunu şu şekilde kullanabilirsin:

@echo off
robocopy C:Kaynak D:Hedef /E /R:3 /W:10
if %ERRORLEVEL% GEQ 8 (
    echo HATA: Yedekleme basarisiz! Exit kodu: %ERRORLEVEL%
    exit /b 1
) else (
    echo Yedekleme basarili tamamlandi.
    exit /b 0
)

Kapsamlı Yedekleme Script Örneği

Tüm bu bilgileri birleştirerek üretim ortamında kullanabileceğin kapsamlı bir yedekleme scripti yapalım:

@echo off
setlocal EnableDelayedExpansion

REM Degisken Tanimlari
set KAYNAK=C:Veriler
set HEDEF=D:Yedekler
set LOG_DIR=C:LogsRobocopy
set TARIH=%date:~-4,4%%date:~-7,2%%date:~0,2%
set SAAT=%time:~0,2%%time:~3,2%
set LOG_DOSYA=%LOG_DIR%yedek_%TARIH%_%SAAT%.log

REM Log dizini yoksa olustur
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

REM Yedekleme baslangiç bildirimi
echo [%TARIH% %SAAT%] Yedekleme basliyor... >> "%LOG_DOSYA%"

REM Ana yedekleme komutu
robocopy "%KAYNAK%" "%HEDEF%Guncel" /E /COPYALL /R:3 /W:15 /MT:8 /XD Temp tmp .git /XF *.tmp *.bak /LOG+:"%LOG_DOSYA%" /TEE /NP /TS /FP

REM Exit kodunu kontrol et
set EXIT_KOD=%ERRORLEVEL%

if %EXIT_KOD% GEQ 8 (
    echo [HATA] Yedekleme hatali tamamlandi. Exit kodu: %EXIT_KOD% >> "%LOG_DOSYA%"
    REM Buraya email bildirimi veya event log yazma eklenebilir
    eventcreate /T ERROR /ID 100 /L APPLICATION /SO "RobocopyYedek" /D "Yedekleme hatali! Exit kodu: %EXIT_KOD%"
    exit /b 1
) else (
    echo [BASARILI] Yedekleme tamamlandi. Exit kodu: %EXIT_KOD% >> "%LOG_DOSYA%"
    eventcreate /T INFORMATION /ID 101 /L APPLICATION /SO "RobocopyYedek" /D "Yedekleme basarili tamamlandi."
    exit /b 0
)

Bu script hem Windows Event Log’a kayıt atar hem de kendi log dosyasını oluşturur. /TS parametresiyle her satıra zaman damgası ekler, /FP ile tam dosya yollarını loglar.

Görev Zamanlayıcı ile Otomatize Etme

Script hazır olduğunda Görev Zamanlayıcı’ya eklemek için komut satırından da oluşturabilirsin:

schtasks /create /tn "GunlukYedekleme" /tr "C:Scriptsyedek.bat" /sc DAILY /st 02:00 /ru SYSTEM /rl HIGHEST /f

Bu komut her gece 02:00’de SYSTEM hesabıyla yüksek öncelikli olarak scripti çalıştırır. /f parametresi aynı isimde görev varsa üzerine yazar.

Görevin durumunu kontrol etmek için:

schtasks /query /tn "GunlukYedekleme" /fo LIST /v

Log Analizi ve Sorun Giderme

Robocopy logları bazen çok ayrıntılı olabilir. Belirli hataları hızlıca bulmak için findstr kullanabilirsin:

findstr /i "ERROR HATA failed" C:Logsyedek.log

Sadece hatalı dosyaları görmek için:

findstr "ERROR" C:Logsyedek.log > C:Logshatali_dosyalar.txt

Özet istatistikleri görmek için log dosyasının sonundaki satırları incelemen yeterli. Robocopy her çalışmanın sonunda toplam dosya sayısı, kopyalanan, atlanan, başarısız ve fazladan dosyaları gösterir.

Sık Yapılan Hatalar

Kaynak yoluna sonda ters bölü koymak: robocopy C:Kaynak D:Hedef şeklinde kaynak yoluna sonda backslash eklersen Robocopy sadece dizin içeriğini değil, dizinin kendisini de farklı yorumlayabilir. Yol sonuna backslash eklememeye özen göster.

MIR parametresini yanlış hedefte kullanmak: /MIR hedefteki fazla dosyaları siler. Hedef yolu yanlış yazarsan önemli verileri silebilirsin. Her zaman önce /L ile test et.

Yeniden deneme değerlerini varsayılan bırakmak: Varsayılan /R değeri 1.000.000’dur. Bir dosyayı kopyalayamazsa bir milyon kez dener, bu da scriptin sonlanmamasına neden olur. Üretim ortamında /R:3 veya /R:5 gibi makul değerler kullan.

MT parametresini çok yüksek ayarlamak: Ağ üzerinden kopyalama yaparken /MT:128 gibi yüksek değerler tam tersine performansı düşürebilir. Ağ bant genişliğine ve hedef sistemin kapasitesine göre ayarla, genellikle 16 ile 32 arası optimal gelir.

Sonuç

Robocopy, Windows ortamlarında dosya kopyalama ve yedekleme işlemleri için gerçekten güçlü ve güvenilir bir araçtır. Öğrenme eğrisi başta biraz dik görünebilir ama bir kere parametrelere alıştıktan sonra onsuz nasıl yaşandığını merak ediyorsun.

Özellikle sunucu migrasyonlarında, günlük yedekleme rutinlerinde ve büyük dosya senkronizasyonlarında Robocopy benim için vazgeçilmez bir araç oldu. /MIR ile senkronizasyon, /IA:A /M ile artımlı yedekleme ve /MT ile paralel kopyalama kombinasyonu çoğu senaryoyu karşılıyor.

Son olarak şunu vurgulamak istiyorum: Her yeni ortamda önce /L ile simülasyon yap, log dosyalarını düzenli incele ve exit kodlarını mutlaka kontrol et. Robocopy’ye güvenebilirsin ama körü körüne değil. Sağlıklı bir yedekleme stratejisi daima doğrulama içerir.

Yorum yapın