martedì 8 novembre 2011

SharePoint 2010 - Backup automatico con PowerShell

Eseguire i backup non è necessario. E’ vitale! Oltre alla funzionalità manuale offerta dal "Sito di Amministrazione Centrale di SharePoint" è possibile automatizzare e schedulare i backup: ecco qui una procedura che sfrutta PowerShell e le operazioni pianificate di Windows.
L’ambiente di riferimento è un Windows Server 2008 SP2, SharePoint Foundation 2010 con applicazione e database sulla stessa macchina.

La procedura è strutturata nel modo seguente:

  • Backup dei dati, un file per ogni applicazione (non sito!). Viene mantenuta una copia del file sulla macchina locale, ed una su una macchina remota
  • Eliminazione dei file di backup (locali e remoti) più vecchi di un certo periodo (configurabile)
  • Backup del database di configurazione (copia locale e remota)
  • Eliminazione dei vecchi backup di configurazione
Ho inserito una funzione chiama “Log”, che marca su un file di testo l’inizio e la fine delle operazioni, utile per valutare i tempi di esecuzione dei vari comandi.

# Scrive su un file di testo il messaggio in input, aggiungendo data e ora
function Log ($evento) {
        $evento = (get-date).ToString() + " - " + $evento
        echo $evento >> $filepath_log
}


Eseguendo lo script direttamente dall’IDE di PowerShell si potrebbero verificare errori di accesso negato alle risorse: sono dovuti alle credenziali dell’account con cui si sta creando lo script. Vediamo più avanti come ovviare al problema. Lo script, almeno nel mio caso, è comunque stato eseguito correttamente, a dispetto degli errori segnalati.

Access to the path 'C:\sp_backup\script\log.txt' is denied.
At C:\SP_Backup\Script\SP_BackUp.PS1:25 char:24
+ echo $evento >> <<<< $filepath_log
+ CategoryInfo : OpenError: (:) [], UnauthorizedAccessException
+ FullyQualifiedErrorId : FileOpenFailure

Una volta creato e salvato lo script (sp_backup.ps1) è necessario pianificarlo. Per fare ciò ho creato il file backup_sharepoint.bat che esegue il seguente comando:

powershell -command C:\sp_backup\Script\sp_backup.ps1

e ne ho pianificato l’esecuzione tramite lo Scheduled Task di Windows. Per ovviare, in fase di esecuzione, agli errori segnalati nell’IDE è necessario selezionare l’opzione “Run with highest privileges”.



Di seguito il codice completo dello script.

# Permette di utilizzare i comandi di SharePoint in Power Shell
Add-PSSnapin Microsoft.SharePoint.PowerShell

###########################
# funzioni personalizzate #
###########################

# Scrive su un file di testo il messaggio in input, aggiungendo data e ora
function Log ($evento) {
       
        $evento = (get-date).ToString() + " - " + $evento
        
        echo $evento >> $filepath_log
}


# Redirige l'output su un file di testo
2 >> $filepath_log

#####################
# variabili globali #
#####################

$filepath_log = "c:\cartella\nomefile.txt"  # path del file di log
$filepath_remoto = "c:\cartella_locale\"  # path di salvataggio remoto
$filepath_locale = "c:\cartella_remota\" # path di salvataggio locale
$cartella_db_configurazione = "cartella_config\" # cartella per i backup del db di configurazione

$timestamp = (get-date).ToFileTimeUTC() # ora di esecuzione: per marcare il nome del file di backup con data e ora
$Days = 5 # giorni di storico da mantenere
$LastWrite = (Get-Date).AddDays(-$days) # intevallo di tempo per cui mantenere i vecchi backup

#####################################################################
#                        BACKUP DATABASE DATI
#####################################################################

Log("Inizio backup applicazioni")

# effettua il backup per ogni Web App creata sullo Sharepoint. Crea tanti file quante sono le applicazioni.
Get-SPWebApplication | Get-SPSite | ForEach-Object {

    $NomeApp =  $_.Url.Replace("http://","").Replace("/","-").Replace(":","")  # normalizza il nome

    Log("Backup applicazione " + $NomeApp )
    
    $BckFile = $NomeApp + "-$timestamp.bak" # nome del file
    
    $BckDirLoc = $filepath_locale + $BckFile # nome completo del file in locale

    Backup-SPSite -Identity $_.Url -Path $BckDirLoc –Force # blocca lo sharepoint in scrittura

    $BckDirRem = $filepath_remoto + $BckFile # nome completo del file in remoto

    copy-item $BckDirLoc $BckDirRem # copia da locale a remoto
}

Log("Fine backup applicazioni")

##############################
# Eliminazione vecchi backup #
##############################

# locale
Log("Eliminazione file locali applicazioni")

$Files = get-childitem $filepath_locale -include *.bak -recurse | Where {$_.LastWriteTime -le "$LastWrite"} 
if ($Files -ne $null){
    foreach ($File in $Files) {
        Remove-Item $File | out-null
    }
}

# remoto
Log("Eliminazione file remoti applicazioni")

$Files = get-childitem $filepath_remoto -include *.bak -recurse | Where {$_.LastWriteTime -le "$LastWrite"} 
if ($Files -ne $null){
    foreach ($File in $Files) {
        Remove-Item $File | out-null
    }
}

#####################################################################
#                  BACKUP DATABASE CONFIGURAZIONE
#####################################################################

Log("Backup database configurazione")

#effettua il backup del database di configurazione
Log("Backup database configurazione - " + (Get-Date))
Backup-SPConfigurationDatabase –Directory $filepath_locale + $cartella_db_configurazione # locale
Backup-SPConfigurationDatabase –Directory $filepath_remoto + $cartella_db_configurazione # remoto

# elimina backup vecchi locali
Get-ChildItem -Path ($filepath_locale + $cartella_db_configurazione) | 
    Where-Object { $_.PSIsContainer } | 
    Where-Object { $_.LastWriteTime -le $LastWrite  } |
    Remove-Item -Recurse

# elimina backup vecchi remoti
Get-ChildItem -Path ($filepath_remoto + $cartella_db_configurazione) | 
    Where-Object { $_.PSIsContainer } | 
    Where-Object { $_.LastWriteTime -le $LastWrite  } |
    Remove-Item -Recurse

# elimina snapin
Remove-PSSnapin Microsoft.SharePoint.PowerShell

Nessun commento:

Posta un commento