Backup SQL Server con PowerShell

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

RemoteSignPower

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:

backup-script

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