PowerShell ile SQL Server yedekleme otomasyonu; bir veya birden fazla veritabanının düzenli FULL backup alınmasını, işlemlerin loglanmasını ve görevin Windows Task Scheduler gibi bir zamanlayıcıyla çalıştırılmasını standartlaştırmak için kullanılabilir. Bu rehberde amaç yalnızca .bak üretmek değil; yedekleme işlemini doğrulanabilir ve sorun giderilebilir bir operasyon haline getirmektir.
Amaç ve Kullanım Senaryosu
Aşağıdaki örnek, belirtilen SQL Server instance üzerindeki kullanıcı veritabanlarını tarih bazlı klasöre FULL backup olarak alır. Her veritabanı için ayrı dosya oluşturur ve işlemin sonucunu log dosyasına yazar.
Bu yaklaşım lab, test ve kontrollü küçük/orta ölçekli ortamlarda yararlı bir otomasyon temelidir. İş kritik üretim ortamlarında ise retention, encryption, immutable/offsite copy, monitoring ve düzenli restore testleri ayrıca tasarlanmalıdır.
Ön Koşullar
- Windows PowerShell 5.1 veya uygun bir PowerShell sürümü
- SQL Server SMO bileşenleri veya SQL Server PowerShell modülleri
- Backup hedefinde yeterli disk alanı
- Script hesabının SQL Server üzerinde backup işlemini gerçekleştirecek yetkilere sahip olması
- SQL Server servis hesabının backup hedef klasörüne yazabilmesi
Güvenlik notu: Otomasyon hesabına yalnız kolaylık için geniş sysadmin yetkisi vermek yerine, ortamın gereksinimine göre en az ayrıcalık prensibi uygulanmalıdır. SQL yetkileri ile dosya sistemi izinleri ayrı ayrı kontrol edilmelidir.
PowerShell SQL Server FULL Backup Script
Örnek değerleri kendi lab veya ortamınıza göre değiştirin. Gerçek sunucu adı, kimlik bilgisi veya kurum içi yol bilgisi script içine gömülmemelidir.
<#
.SYNOPSIS
SQL Server kullanıcı veritabanlarını FULL backup olarak yedekler.
#>
param(
[string]$SqlInstance = "localhost",
[string]$BackupRoot = (Join-Path $env:SystemDrive "SQLBackups")
)
$DateTag = Get-Date -Format "yyyyMMdd"
$BackupPath = Join-Path $BackupRoot $DateTag
$LogFile = Join-Path $BackupPath "BackupLog_$DateTag.txt"
if (-not (Test-Path $BackupPath)) {
New-Item -Path $BackupPath -ItemType Directory -Force | Out-Null
}
function Write-Log {
param([string]$Message)
$Time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$Time - $Message" | Out-File -FilePath $LogFile -Append -Encoding utf8
}
try {
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
$Server = New-Object Microsoft.SqlServer.Management.Smo.Server $SqlInstance
$Databases = $Server.Databases | Where-Object {
$_.IsSystemObject -eq $false -and $_.Name -ne "tempdb"
}
Write-Log "Backup işlemi başladı. Instance: $SqlInstance"
foreach ($Db in $Databases) {
$DbName = $Db.Name
$BackupFile = Join-Path $BackupPath ("{0}_{1}.bak" -f $DbName, $DateTag)
try {
Write-Log "Başlıyor: $DbName"
$Backup = New-Object Microsoft.SqlServer.Management.Smo.Backup
$Backup.Action = "Database"
$Backup.Database = $DbName
$Backup.Devices.AddDevice($BackupFile, "File")
$Backup.Initialize = $true
$Backup.Checksum = $true
$Backup.ContinueAfterError = $false
$Backup.SqlBackup($Server)
Write-Log "Tamamlandı: $DbName -> $BackupFile"
}
catch {
Write-Log "HATA: $DbName -> $($_.Exception.Message)"
}
}
Write-Log "Backup işlemi tamamlandı."
}
catch {
Write-Log "KRİTİK HATA: $($_.Exception.Message)"
throw
}
Script Nasıl Çalışıyor?
Script önce yyyyMMdd formatında günlük bir klasör oluşturur. Ardından SMO üzerinden SQL Server instance’a bağlanır, kullanıcı veritabanlarını listeler ve her veritabanı için ayrı FULL backup başlatır. Checksum özelliği backup işlemi sırasında checksum kullanılmasını sağlar; ancak tek başına başarılı restore garantisi değildir.
Backup Sonrası Doğrulama
Ben bu tür bir otomasyonda yalnızca script’in hata vermeden bitmesine güvenmem. En az şu kontroller yapılmalıdır:
- Beklenen
.bakdosyaları oluşmuş mu? - Dosya boyutları makul mü ve hedef diskte yeterli alan var mı?
- Log dosyasında başarısız veritabanı bulunuyor mu?
- SQL Server tarafında backup geçmişi beklenen zamanı gösteriyor mu?
- Belirli aralıklarla gerçek restore testi yapılıyor mu?
Yedek ancak gerektiğinde geri yüklenebildiği doğrulandığında anlamlıdır.
Windows Task Scheduler ile Zamanlama
Script dosyasını örneğin sistem sürücüsündeki Scripts klasöründe SqlFullBackup.ps1 adıyla saklayabilirsiniz. Task Scheduler oluştururken PowerShell executable, script dosyası ve çalışma hesabını ayrı alanlarda tanımlamak; karmaşık kaçış karakterlerinden kaçınmak açısından daha güvenlidir.
$ScriptPath = Join-Path $env:SystemDrive "Scripts\SqlFullBackup.ps1"
powershell.exe -NoProfile -File $ScriptPath
Üretim ortamında görevin hangi servis hesabıyla çalıştığı, hesabın parola/secret yönetimi ve “Run whether user is logged on or not” gibi Task Scheduler ayarları ayrıca değerlendirilmelidir.
Sık Karşılaşılan Hatalar
Access Denied
SQL Server yetkisi ile backup klasöründeki NTFS erişimini ayrı ayrı kontrol edin. Özellikle SQL Server servis hesabının hedef dosyaya yazma yetkisini gözden kaçırmayın.
SMO Assembly Yüklenemiyor
SMO bileşenlerinin kurulu olduğunu ve script’in doğru PowerShell mimarisinde çalıştığını doğrulayın. Modern ortamlarda SQL Server PowerShell modülünün kullanımı da değerlendirilebilir.
Backup Device veya Disk Hatası
Disk kapasitesini, hedef yolun erişilebilirliğini, NTFS izinlerini ve varsa güvenlik yazılımı engellerini kontrol edin. Log dosyasında yalnız genel hata mesajına değil exception ayrıntısına bakın.
Üretim Ortamı İçin Güvenlik ve Best Practice
- Backup dosyalarını yalnız aynı sunucuda tutmayın.
- Retention politikasını kapasiteye göre açıkça tanımlayın.
- İş kritik sistemlerde şifreleme ve immutable/offsite kopya planlayın.
- Backup başarısızlıklarını izleme/uyarı sistemine bağlayın.
- Script içine kullanıcı adı veya parola gömmeyin.
- Backup kadar restore prosedürünü de dokümante edin ve test edin.
PowerShell Operasyon Merkezi
Cmdlet, pipeline ve günlük sistem yönetimi örnekleri için PowerShell Komutları ana referansına; script geliştirme mantığı için PowerShell Script Nedir ve Nasıl Yazılır? rehberine geçebilirsiniz. Hazır operasyon komutları için Komut Kütüphanesi kullanılabilir.
Sonuç
PowerShell ile SQL Server backup otomasyonu, yedekleme işlemini tekrar edilebilir ve loglanabilir hale getirir. Ancak script’in çalışması tek başına bir backup stratejisi değildir. Sağlıklı yapı; yetki kontrolü, kapasite ve retention yönetimi, harici/immutable kopyalar, izleme ve düzenli restore testleriyle tamamlanmalıdır.
