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.
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.
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
# 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
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
# 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