Un processo di backup può essere molto semplice o molto complessa a seconda delle vostre esigenze. In questo post ho intenzione di mostrare come è possibile eseguire il backup dei database del server SQL utilizzando PowerShell.
Per primo luogo dobbiamo abilitare PowerShell per le nostre operazioni quindi digitare
PS C: \>
Set-ExecutionPolicy
RemoteSigned
Una volta eseguito questo script possiamo passare al programma vero e proprio.
Lo script di backup in questione effettua il backup di tutti i database SQL Server ad eccezzione del database di sistema e scrive i file di backup sul disco locale.
Dopo che tutti i backup sono stati completati lo script rimuove tutti i backup più vecchi del numero di giorni specificati nella variabile “daysToStoreBackups” -parameter.
Ecco lo script in questione:
param( $serverName, $backupDirectory, $daysToStoreBackups ) [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $serverName $dbs = $server.Databases foreach ($database in $dbs | where { $_.IsSystemObject -eq $False }) { $dbName = $database.Name $timestamp = Get-Date -format yyyy-MM-dd-HHmmss $targetPath = $backupDirectory + "\" + $dbName + "_" + $timestamp + ".bak" $smoBackup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup") $smoBackup.Action = "Database" $smoBackup.BackupSetDescription = "Full Backup of " + $dbName $smoBackup.BackupSetName = $dbName + " Backup" $smoBackup.Database = $dbName $smoBackup.MediaDescription = "Disk" $smoBackup.Devices.AddDevice($targetPath, "File") $smoBackup.SqlBackup($server) "backed up $dbName ($serverName) to $targetPath" } Get-ChildItem "$backupDirectory\*.bak" |? { $_.lastwritetime -le (Get-Date).AddDays(-$daysToStoreBackups)} |% {Remove-Item $_ -force } "removed all previous backups older than $daysToStoreBackups days"
Ora prepariamo il file .bat per eseguirlo, per esempio backup.bat
PowerShell C: \ Backup \ Tools \ Backup.ps1 -servername "WIN-1GA63L4PFK6 \ SQLEXPRESS" -backupDirectory "C: \ Backup \ backup" -daysToStoreBackups 7 >> C: \ Backup \ Logs \ data%% .log
A questo punto possiamo schedulare il tutto come mostra la seguente immagine:
Ed il gioco è fatto.
Per maggiore sicurezza potremmo aggregare un semplice script che copia in rete o su unità nastro il backup SQL appena creato per esempio con questo script:
$date = Get-Date -Format d.MMMM.yyyy
$source = “C:\backup\”
$destination = “\\10.0.0.252\Backup”
$path = test-Path $destination
# Backup Process started
test-Path $destination
copy-Item -Force -Recurse $source -Destination $destination
write-host “Backup Sucessfull”
Con questo riusciamo a gestire i backup dei nostri database SQL Server in ambiente di produzione!
Fonte parziale:antonkallenberg