+
Pianificare i backup di SharePoint 2010 con Windows Powershell
Pubblicato il: 08/12/2010
Da: Riccardo Celesti
Lingua: Italiano
Livello: 300

Nonostante i molti miglioramenti presenti in SharePoint 2010 in materia di protezione dei dati, anche nella “wave 14” del prodotto, manca una funzionalità out-of-the-box per la pianificazione dei backup. Tuttavia grazie alla grandi potenzialità di Windows Powershell è possibile raggiungere questo obiettivo con uno sforzo minimo. Nei paragrafi seguenti vedermo come sia possibile predisporre uno script per il backup di tutte le site collection della nostra farm SharePoint.

Script Powershell

Per eseguire il backup di una site collection “isolata” ci basterebbe l’esecuzione di una singola cmdlet (Backup-SPSite + parametri), in tutto meno di una riga di codice. Il nostro obiettivo è però quello di automatizzare il processo di backup, per non dover modificare lo script ogni qual volta si aggiunga una site collection, o una web application nella nostra farm.

Powershell ci permette di concatenare l’esecuzione di più comandi, in questo modo potremo prima leggere l’elenco di tutte le web application (Get-SPWebApplications), per ciascuna di esse leggere l’elenco di tutte le site collection (Get-SPSite) e quindi eseguirne il backup (Backup-SPSite) utilizzando per questo i parametri ottenuti dall’esecuzione delle operazione precedenti ($_.Url che corrisponde all’URL della Site Collection “corrente”).

Vediamo quindi come apparirà lo script.

Get-SPWebApplication | Get-SPSite| ForEach-Object {

Backup-SPSite -Identity $_.Url -Path “C:\ilmiopath\ilmiobackup.bak” –Force ## -UseSQLSnapshot -NoSiteLock

}

 

Nota: L’utilizzo del parametro UseSQLSnapshot è legato alla versione di SQL Server, mentre il parametro NoSiteLock permette di evitare che per la durata del backup la site collection sia “Read Only”. Entrambi i parametri sono opzionali

 

A questo punto si pone il primo “problema”. In questo modo tutti i file avrebbero lo stesso nome e questo non sarebbe un bene per i nostri dati. Vediamo subito come risolvere. Per la generazione di un nome file univoco ci appoggeremo, come spesso avviene, su un timestamp (data corrente in f.to UTC)  concatenato all’url della site collection “ripulito” dai caratteri non consenti ($_.Url.Replace(oldtext,newtext)).

$timestamp = (get-date).ToFileTimeUTC()

 

Per una maggiore praticità “esternalizziamo” anche il nome della directory dove verranno salvati i file di backup.

 

$filepath = “C:\ilmiopath”

 

Ora dobbiamo aggiornare lo script di backup come segue.

Get-SPWebApplication | Get-SPSite| ForEach-Object {

     $BckDir = $filepath + $_.Url.Replace("http://","").Replace("/","-").Replace(":","") + "-$timestamp.bak"

Backup-SPSite -Identity $_.Url -Path $BckDir –Force ## -UseSQLSnapshot -NoSiteLock

}

 

Una esigenza molto diffusa è infine quella di mantere un storico dei backup “limitato” nel tempo. Grazie a Powershell, aggiungendo poche altre righe di codice potremo soddisfare anche questa richiesta.

Cominciamo col definire tre variabili di appoggio: quanti giorni vogliamo che i nostri file di backup vengano mantenuti ($Days), la data corrente ($Now) e la data prima della quale dobbiamo fare in modo che i file di backup vengano cancellatio ($LastWrite).

$Now = Get-Date

$Days = 14

$LastWrite = $Now.AddDays(-$days)

 

In questo caso salveremo all’interno di una variabile ($Files) tutti i file con estensione .bak (-include *.bak) di una directory specifica (get-childitem $FilePath) più vecchi della nostra data di controllo ( Where {$_.LastWriteTime -le "$LastWrite"}) e successivamente, facendo un ciclo tra tutti questi elementi, li cancelleremo (Remove-Item).

$Files = get-childitem $filepath -include *.bak -recurse | Where {$_.LastWriteTime -le "$LastWrite"}

 

if ($File -ne $null){

    foreach ($File in $Files) {

        Remove-Item $File | out-null

    }

}

 

Ricapitoliamo ora come apparirà lo script completo.

Add-PSSnapin Microsoft.SharePoint.PowerShell

 

$timestamp = (get-date).ToFileTimeUTC()

$filepath = “C:\ilmiopath”

$Now = Get-Date

$Days = 14

$LastWrite = $Now.AddDays(-$days)

 

Get-SPWebApplication | Get-SPSite| ForEach-Object {

     $BckDir = $filepath + $_.Url.Replace("http://","").Replace("/","-").Replace(":","") + "-$timestamp.bak"

Backup-SPSite -Identity $_.Url -Path $BckDir –Force ##-UseSQLSnapshot -NoSiteLock

}

 

$Files = get-childitem $filepath -include *.bak -recurse | Where {$_.LastWriteTime -le "$LastWrite"}

 

if ($File -ne $null){

    foreach ($File in $Files) {

        Remove-Item $File | out-null

    }

}

 

Per poter schedulare lo script dovremo infine salvare il nostro script in un file .ps1, estensione degli script Powershell. Per farlo possiamo utilizzare anche notepad (come per qualsiasi cosa J) o un editor specifico come Powershell ISE (feature di Windows Server 2008 R2) o PowerGUI Script Editor.

Pianificazione dei backup

Per la schedulazione dello script di backup ci avvarremo delle funzionalità di Windows Task Scheduler.

1)      Per prima cosa dobbiamo creare un nuovo task.

Figura 1
 

2)      Inseriamo le informazioni minime per riconoscere il nostro task (Nome e Descrizione), l’account che eseguire l’attività (attenzione alle permission) e indichiamo che il job deve essere eseguito anche quando l’account specificato non è loggato.

Figura 2
 

3)      Spostandoci sul tab “Triggers”, cliccando su “New”, andiamo ad indicare in che occasione dovrà essere attivato il nostro task. Il trigger potrebbe essere sia un evento (ad esempio il logon di un utente) che una data specifica, come nel nostro caso.

Figura 3
 

4)      Selezioniamo quindi la voce “On a schedule” e impostiamo la pianificazione che più rispecchia le nostre esigenze di protezione.  In questo esempio ho schedulato l’esecuzione dello script di backup ogni giorno alle 20:00. E’ stato inoltre specificato che il task è abilitato (Enabled) e che l’esecuzione dello script deve essere bloccata se questa dura più di otto ore.

Figura 4
 

5)      Nel tab “Action” andiamo infine a specificare cosa dovrà essere eseguito all’orario prestabilito, cioè lo script di backup.

Figura 5
 

6)      Dal menù “Action” selezioniamo “Start a program”

7)      Nel campo “Program/Script” dobbiamo indicare il path relativo al file Powershell.exe (C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe)

8)      Nel campo “Add argument (Optional) dobbiamo specificare il percorso completo relativo allo script di Backup, rispettando la sintassi seguente:  -command "&  '<path del file .ps1>'"

Figura 6
 

9)      Confermando le impostazioni verrà richiesta la password dell’utente che eseguirà il task. Completata anche quest’ultima attività siamo pronti per testare la soluzione.

10)      Selezioniamo il task appena creato e clicchiamo su “Run”. Voilà! J

Figura 7
 

Considerazioni finali

Possiamo considerare lo script che abbiamo predisposto un punto di partenza per un’adeguata protezione dei dati in SharePoint 2010. Le possibilità di ampliamento sono molte; ad esempio è possibile predisporre uno script analogo per i backup “full farm” o aumentare il livello di granularità scendendo fino a livello di web.

E’ inoltre possibile aggiungere funzionalità di notifica al completamento dell’operazione di salvataggio dei dati o di scrittura di un log in una “repository” esterno (event viewer, database, file di testo, SharePoint J,  ecc...), il tutto con poche righe di codice in più. Buon lavoro J.

Allegato: lo script di esempio

Tags


Destinatari


Prodotti

Microsoft SharePoint Server 2010
SharePoint Foundation 2010


Bookmark and Share