Backup konusunu ciddiye almayan sysadmin’lerin sonunda pişman olduğunu hepimiz biliriz. “Bende bir şey olmaz” diyenlerin tam da production sunucusunda kritik bir veri kaybı yaşadığında arayıp “nasıl geri alırız?” diye sorduğunu defalarca gördüm. Windows Server Backup, özellikle PowerShell ile birleşince oldukça güçlü ve esnek bir yapıya kavuşuyor. Bu yazıda sadece tıkla-geç GUI yönetimini değil, gerçek anlamda komut satırından backup yönetimini ele alacağız.
Windows Server Backup Neden Komut Satırından Yönetilmeli?
GUI üzerinden backup almak kolaydır, evet. Ama düşün bir: 20 sunucun var ve hepsinde backup politikasını güncellemen gerekiyor. Ya da bir disaster recovery senaryosunda hızlıca bir volume’ü geri yüklemen lazım ve RDP bağlantın yavaş. İşte tam burada PowerShell ve wbadmin devreye giriyor.
Komut satırı yönetiminin avantajları şunlar:
- Otomasyon: Scheduled task veya script ile tamamen otomatik backup akışı kurabilirsin
- Uzaktan yönetim: PSRemoting üzerinden onlarca sunucuyu tek noktadan idare edersin
- Hız: GUI’yi açmadan hızlıca backup başlatabilir, durumunu kontrol edebilirsin
- Loglama: Script çıktılarını loglayarak merkezi izleme sistemine aktarabilirsin
- Tutarlılık: Her sunucuda aynı politikanın uygulandığından emin olursun
Gerekli Modüller ve Kurulum
Windows Server Backup varsayılan olarak kurulu gelmez. Önce feature’ı yüklemen gerekiyor.
# Windows Server Backup feature kurulumu
Install-WindowsFeature -Name Windows-Server-Backup -IncludeManagementTools
# Kurulumu doğrula
Get-WindowsFeature -Name Windows-Server-Backup
Kurulum tamamlandıktan sonra WindowsServerBackup PowerShell modülü otomatik olarak kullanılabilir hale gelir. Modülü kontrol etmek için:
# Mevcut komutları listele
Get-Command -Module WindowsServerBackup
# Modül versiyonunu kontrol et
Get-Module -Name WindowsServerBackup -ListAvailable
Bu komut sana Get-WBPolicy, New-WBPolicy, Start-WBBackup, Get-WBBackupTarget gibi onlarca cmdlet’i listeleyecek.
wbadmin ile Temel Backup İşlemleri
PowerShell cmdlet’lerinden önce wbadmin aracını öğrenmek iyi bir başlangıç noktası. Komut satırına bağlı eski alışkanlığı olanlar için ve bazı senaryolarda daha direkt kullanım sunan bu araç hâlâ çok işe yarıyor.
# Sistem durumunu backup'a al (System State Backup)
wbadmin start systemstatebackup -backuptarget:E: -quiet
# Belirli bir volume'ü backup al
wbadmin start backup -backuptarget:E: -include:C: -quiet
# Mevcut backup versiyonlarını listele
wbadmin get versions
# Belirli bir backup hakkında detay al
wbadmin get items -version:01/15/2024-22:00
-quiet parametresi etkileşim gerektirmeden komutu çalıştırır. Script içinde kullanacaksan bu parametreyi mutlaka ekle, yoksa script onay bekleyip takılır.
PowerShell ile Backup Policy Oluşturma
Gerçek güç burada başlıyor. PowerShell cmdlet’leri ile tam anlamıyla programatik bir backup politikası tanımlayabilirsin.
# Yeni bir backup policy oluştur
$policy = New-WBPolicy
# C: sürücüsünü backup'a dahil et
$volume = Get-WBVolume -VolumePath "C:"
Add-WBVolume -Policy $policy -Volume $volume
# Backup hedefini belirle (harici disk veya network share)
$backupLocation = New-WBBackupTarget -VolumePath "E:"
Add-WBBackupTarget -Policy $policy -Target $backupLocation
# Zamanlamayı ayarla (her gün 23:00'da)
Set-WBSchedule -Policy $policy -Schedule 23:00
# System State backup'ı da dahil et
Add-WBSystemState -Policy $policy
# Bare Metal Recovery için ayarla
Add-WBBareMetalRecovery -Policy $policy
# Politikayı uygula
Set-WBPolicy -Policy $policy
Bu adımları tek tek çalıştırmak yerine bir script haline getirip kaydedebilirsin. Böylece yeni bir sunucu kurduğunda tek script çalıştırarak backup politikasını otomatik uygularsın.
Network Share’e Backup Alma
Pratikte en çok kullanılan senaryo network share üzerine backup almak. Özellikle merkezi bir backup sunucusu varsa tüm makinelerden oraya yazmak isteyeceksin.
# Network backup target tanımla
$networkTarget = New-WBBackupTarget -NetworkPath "\backupserverbackups" `
-Credential (Get-Credential)
# Mevcut policy'yi al ve network target ekle
$currentPolicy = Get-WBPolicy
Add-WBBackupTarget -Policy $currentPolicy -Target $networkTarget -Force
# Policy'yi güncelle
Set-WBPolicy -Policy $currentPolicy -Force
# Hemen backup başlat
Start-WBBackup -Policy $currentPolicy
Network backup yaparken dikkat etmen gereken nokta, hedef makinede yeterli disk alanı olması ve servis hesabının yazma yetkisi bulunması. Yoksa backup başlar gibi yapıp yarı yolda kesilir ve bunu ancak hata logundan anlarsın.
Backup Durumunu İzleme ve Raporlama
Backup aldın, güzel. Peki gerçekten tamamlandı mı, ne kadar sürdü, hata var mı? Bunları kontrol etmeden backup almak, yedeği olmayan sistemi yedekli sanmak kadar tehlikeli.
# Son backup işleminin durumunu kontrol et
Get-WBJob -Previous 1
# Tüm backup geçmişini listele
Get-WBSummary
# Backup detaylarını al
$lastJob = Get-WBJob -Previous 1
$lastJob | Select-Object -Property JobType, StartTime, EndTime, JobState, HResult
# Hata durumunda detaylı mesaj
if ($lastJob.HResult -ne 0) {
Write-Host "BACKUP HATASI! HResult: $($lastJob.HResult)" -ForegroundColor Red
$lastJob.ErrorDescription
}
HResult değeri 0 ise başarılı demektir. Farklı bir değer görürsen hata kodu araştırman gerekiyor. Bu kontrolü otomatik bir monitoring script’ine koymak, backup başarısız olduğunda seni anında haberdar edebilir.
Otomatik Backup ve E-posta Bildirim Script’i
İşte gerçek dünya senaryosu. Bir production ortamında backup alıp sonucunu e-posta ile raporlayan tam kapsamlı bir script:
# Backup-And-Report.ps1
param(
[string]$BackupTarget = "\backupserverwinbackups",
[string]$SmtpServer = "smtp.sirket.local",
[string]$MailTo = "[email protected]",
[string]$MailFrom = "[email protected]"
)
$logFile = "C:LogsBackupLog_$(Get-Date -Format 'yyyyMMdd').txt"
$serverName = $env:COMPUTERNAME
$startTime = Get-Date
function Write-Log {
param([string]$Message, [string]$Level = "INFO")
$logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$Level] $Message"
Add-Content -Path $logFile -Value $logEntry
Write-Host $logEntry
}
Write-Log "Backup baslatiliyor: $serverName"
try {
# Mevcut policy ile backup başlat
$policy = Get-WBPolicy
if ($null -eq $policy) {
Write-Log "Policy bulunamadi, yeni policy olusturuluyor..." "WARN"
$policy = New-WBPolicy
$vol = Get-WBVolume -VolumePath "C:"
Add-WBVolume -Policy $policy -Volume $vol
$target = New-WBBackupTarget -NetworkPath $BackupTarget -Credential (Get-StoredCredential -Target "BackupCred")
Add-WBBackupTarget -Policy $policy -Target $target
Add-WBSystemState -Policy $policy
Set-WBPolicy -Policy $policy -Force
}
Start-WBBackup -Policy $policy -Force
$job = Get-WBJob -Previous 1
$duration = $job.EndTime - $job.StartTime
$status = if ($job.HResult -eq 0) { "BASARILI" } else { "BASARISIZ" }
Write-Log "Backup tamamlandi. Durum: $status, Sure: $($duration.TotalMinutes) dakika"
# E-posta gönder
$subject = "[$status] $serverName Backup Raporu - $(Get-Date -Format 'dd.MM.yyyy')"
$body = @"
Sunucu: $serverName
Tarih: $(Get-Date -Format 'dd.MM.yyyy HH:mm')
Durum: $status
Baslangic: $($job.StartTime)
Bitis: $($job.EndTime)
Sure: $([math]::Round($duration.TotalMinutes, 2)) dakika
HResult: $($job.HResult)
"@
Send-MailMessage -SmtpServer $SmtpServer -To $MailTo -From $MailFrom `
-Subject $subject -Body $body -Encoding UTF8
} catch {
Write-Log "Kritik hata: $($_.Exception.Message)" "ERROR"
Send-MailMessage -SmtpServer $SmtpServer -To $MailTo -From $MailFrom `
-Subject "[KRITIK HATA] $serverName Backup Hatasi" `
-Body "Hata: $($_.Exception.Message)" -Encoding UTF8
}
Bu script’i Task Scheduler’a ekleyip her gece çalıştırdığında hem backup alıyor hem de sabah işe geldiğinde mailini kontrol ederek durumu görüyorsun.
Backup’tan Geri Yükleme İşlemleri
Backup almanın yarısı, geri yüklemesini bilmek. Çoğu sysadmin backup alır ama restore test etmez. Bu büyük bir hata. Hiç test etmediğin bir backup seti, krize girdiğinde seni hayal kırıklığına uğratabilir.
# Mevcut backup versiyonlarını listele
wbadmin get versions -backupTarget:\backupserverwinbackups
# Belirli dosyaları geri yükle
wbadmin start recovery `
-version:01/15/2024-22:00 `
-itemType:File `
-items:C:ImportantDatakritik.db `
-recoveryTarget:C:Recovered `
-quiet
# Volume recovery (dikkatli kullan!)
wbadmin start recovery `
-version:01/15/2024-22:00 `
-itemType:Volume `
-items:C: `
-recoveryTarget:D: `
-quiet
# System State recovery
wbadmin start systemstaterecovery `
-version:01/15/2024-22:00 `
-quiet
Özellikle Volume recovery yaparken hedef sürücüyü doğru girdiğinden emin ol. Yanlış hedef seçmek mevcut veriyi ezer ve iç içe geçmiş bir felakete yol açar.
Eski Backup’ları Temizleme ve Disk Yönetimi
Backup diskin dolmasını beklemek yerine proaktif olarak eski yedekleri temizlemek gerekiyor. Windows Server Backup kendi retention mekanizmasına sahip olsa da bunu manuel kontrol etmek çok daha güvenli.
# Backup hedefindeki mevcut versiyonları listele
$versions = wbadmin get versions -backupTarget:E: 2>&1
# 30 günden eski backup'ları sil (PowerShell ile)
$cutoffDate = (Get-Date).AddDays(-30)
Get-WBBackupTarget | ForEach-Object {
$target = $_
Write-Host "Hedef kontrol ediliyor: $($target.TargetType)"
}
# Belirli bir backup versiyonunu sil
wbadmin delete systemstatebackup -version:01/01/2024-23:00 -quiet
# En eski N backup dışındakileri sakla
wbadmin delete backup -keepVersions:5 -quiet
-keepVersions:5 parametresi son 5 backup’ı tutar, daha eskileri siler. Disk alanın kısıtlıysa bu parametreyi düşük tutmak işe yarar ama çok da düşürmemek lazım. Bir backup seti bozulduğunda bir öncekine dönebilmek için en az 3-5 versiyon tutmanı öneririm.
Çoklu Sunucu Yönetimi
20-30 sunucun varsa her birine ayrı ayrı bağlanıp backup durumunu kontrol etmek zaman kaybı. PSRemoting ile tümünü tek seferde sorgulayabilirsin.
# Sunucu listesinden tüm backup durumlarını al
$sunucular = @("sunucu01", "sunucu02", "sunucu03", "sunucu04")
$backupRaporu = Invoke-Command -ComputerName $sunucular -ScriptBlock {
try {
$job = Get-WBJob -Previous 1 -ErrorAction Stop
[PSCustomObject]@{
Sunucu = $env:COMPUTERNAME
Durum = if ($job.HResult -eq 0) { "OK" } else { "HATA" }
SonBackup = $job.EndTime
Sure = [math]::Round(($job.EndTime - $job.StartTime).TotalMinutes, 1)
HResult = $job.HResult
}
} catch {
[PSCustomObject]@{
Sunucu = $env:COMPUTERNAME
Durum = "VERI YOK"
SonBackup = $null
Sure = 0
HResult = -1
}
}
}
# Sonuçları ekrana bas
$backupRaporu | Sort-Object Sunucu | Format-Table -AutoSize
# Sadece hatalı olanları filtrele
$hatalilar = $backupRaporu | Where-Object { $_.Durum -ne "OK" }
if ($hatalilar) {
Write-Host "`nHATALI SUNUCULAR:" -ForegroundColor Red
$hatalilar | Format-Table -AutoSize
}
Bu script’i her sabah çalıştırarak gecenin backup durumunu hızlıca görebilirsin. Hatalı sunucuları filtreleyip direkt üzerlerine odaklanmak sabah zaman kazandırır.
Backup Boyutu ve Performans Optimizasyonu
Backup süresinin çok uzadığını veya ağın yavaşladığını fark ediyorsan birkaç optimizasyon seçeneği var.
VSS (Volume Shadow Copy Service) ayarları:
- Büyük veritabanlarının bulunduğu volume’leri ayrı ayrı backup al, aynı anda hepsini alma
- SQL Server gibi uygulamalar için application-aware backup kullan
Bandwidth yönetimi:
- Backup’ı gece 02:00-04:00 gibi düşük trafik saatlerine planla
- Network share backup yapıyorsan QoS kuralı tanımlamayı düşün
İçerik filtreleme:
# Backup'a dahil edilmeyecek dosya türleri tanımla
$policy = Get-WBPolicy
$exclusion = New-WBFileSpec -FileSpec "C:Temp" -Exclude
Add-WBFileSpec -Policy $policy -FileSpec $exclusion
# Log dosyalarını ve temp dizinleri hariç tut
$logExclusion = New-WBFileSpec -FileSpec "*.log" -Exclude
Add-WBFileSpec -Policy $policy -FileSpec $logExclusion
Set-WBPolicy -Policy $policy -Force
C:Temp, C:WindowsTemp gibi dizinleri ve geçici dosyaları hariç tutmak backup boyutunu ciddi oranda küçültür. Bir müşteri ortamında bu optimizasyonla backup süresini 4 saatten 1.5 saate indirdiğimizi gördüm.
Yaygın Hatalar ve Çözümleri
VSS writer hatası:
# VSS writer durumunu kontrol et
vssadmin list writers
# Sorunlu writer'ı sıfırla
net stop vss
net stop swprv
net start swprv
net start vss
“Another backup is already in progress” hatası:
# Çalışan backup işlemini bul ve durdur
$runningJob = Get-WBJob | Where-Object { $_.JobState -eq "Running" }
if ($runningJob) {
Stop-WBJob -Job $runningJob
}
Yetersiz disk alanı uyarısı:
- Backup hedef diskinde en az backup boyutunun 1.5 katı boş alan bulunmalı
Get-WBDiskInfoile hedef disk bilgilerini kontrol et
Erişim yetkisi sorunları:
- Network share için kullanılan hesabın write yetkisi olduğunu doğrula
- Credential’ı script içine gömmek yerine Windows Credential Manager kullan
Backup Doğrulama
Aldığın backup’ın gerçekten sağlam olduğunu doğrulamak için katalog kontrolü yapabilirsin:
# Backup kataloğunun bütünlüğünü doğrula
wbadmin start recovery -version:01/15/2024-22:00 -itemType:File `
-items:C:kritik_dosya.txt -recoveryTarget:C:TestRestore -quiet
# Test restore sonrası dosyanın gelip gelmediğini kontrol et
if (Test-Path "C:TestRestorekritik_dosya.txt") {
Write-Host "Backup dogrulama BASARILI" -ForegroundColor Green
Remove-Item "C:TestRestorekritik_dosya.txt" -Force
} else {
Write-Host "Backup dogrulama BASARISIZ!" -ForegroundColor Red
}
Ayda en az bir kez böyle bir doğrulama yapmak iyi pratik. Önemli bir verinin restore edilebilir olduğunu test etmeden bilemezsin.
Sonuç
Windows Server Backup’ı komut satırından yönetmek başlangıçta fazla teknik görünebilir, ama bir kez alıştıktan sonra GUI’ye geri dönmek istemiyorsun. Script tabanlı yönetim; tutarlılık, otomasyon ve merkezi izleme açısından sana büyük avantaj sağlıyor.
Özetlemek gerekirse yapman gerekenler:
- wbadmin ile temel işlemlere hakim ol
- PowerShell cmdlet’leri ile policy yönetimini otomatize et
- Her backup sonrası durum kontrolü yap ve logla
- Düzenli aralıklarla restore testi gerçekleştir
- Çoklu sunucu ortamlarında PSRemoting’i kullan
- E-posta bildirimi kurarak proaktif izleme sağla
Backup, “olsa iyi olur” kategorisinde değil, kritik altyapı bileşenleri arasında değerlendirilmeli. Komut satırından yönetimi bu süreci daha güvenilir ve tekrarlanabilir kılıyor. Bir felaket anında saatlerce uğraşmak yerine birkaç komutla sistemi ayağa kaldırabilmek, gecenin köründe bile seni sakin tutar.