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ığı:
/MTparametresiyle 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:
\FileserverPaylasimkaynak UNC yolu/Eile boş dizinler dahil tümü kopyalanıyor/COPYALLile izinler, sahiplik ve diğer tüm özellikler korunuyor/R:3 /W:10ile başarısız dosyalar 3 kez, 10 saniye arayla yeniden deneniyor/MT:16ile 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/TEEile 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.