Veeam : Comment modifier la rétention d’une sauvegarde VeeamZIP   

Depuis la version 6.1, Veeam a introduit un super outil VeeamZIP qui vous permet d’effectuer la sauvegarde d’une VM et de programmer aussi la suppression du fichier de backup automatiquement.

Nous utilisons cette fonctionnalité surtout pour des opérations ponctuelles sur une VM (maintenance, mise à jour, update applicatif…) ainsi on se débarrasse des snapshots VMware et leurs complexités.

 

Le nom du job est créé automatiquement avec le nom de la VM à sauvegarder suivi de la date, et pour la rétention du fichier backup vous avez 9 choix prédéfinis.

Sur la console Veeam, vous pouvez voir les informations de vos dans Backups Disk (VeeamZIP)

Comme vous le constatez, il manque une information très importante dans la console la date de suppression du fichier de sauvegarde.

Vous pouvez voir cette information uniquement sur la base des données Veeam dans la table [VeeamBackup].[dbo].[Backup.Model.VeeamZIPRetention]

La suppression des fichiers de sauvegarde se fait avec un processus VeeamZIP retention qui passe chaque nuit à 00:00 pour vérifier les retentions est ainsi supprime ce qui doit être supprimer (log Svc.VeeamBackup).

Après une opération de mise à jour applicative qui a mal tournée, un de nos collègues nous a demandé d’étendre la rétention d’une sauvegarde prévue d’être supprimée dans une semaine à un mois.

Nous partageons avec vous ce script qui permet de faire ça, mais n’oubliez pas de sauvegarder votre base de données

Enjoy!

PowerShell Script

####################################################################################################################################################################
# User Defined Variables
####################################################################################################################################################################
$VeeamSQLServer = ''
$VeeamDatabase = ''
$SQLUserName = ''
$SQLPassword = ''
$ConnectionTimeout = 30
###################################################################################################################################################################
$vmName = read-host "VM Name to search :"
while(1){
	Try{
		$retainDateTime = [datetime](read-host 'Enter retain date/time (format is: yyyy-MM-dd HH:mm:ss or yyyy-MM-dd)')
		break
    }
	Catch{
		Write-Host 'Not a valid date' -fore red
    }
}
$QueryTimeout = 120
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server={0};Database={1};uid={2};pwd={3};Connect Timeout={4}" -f $SQLServer, $Database,$UserName ,$Password, $ConnectionTimeout
Try
        {
           $SqlConnection.Open()
           $sql = "SELECT * FROM [VeeamBackup].[dbo].[Backup.Model.VeeamZIPRetention] where [target_file] like '%{0}%'" -f $vmName
           $cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$SqlConnection)
           $cmd.CommandTimeout = $QueryTimeout
           $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $cmd
           $dataset = New-Object System.Data.DataSet
           $adapter.Fill($dataSet) | Out-Null
if ($dataset.Tables[0].Rows.Count -eq 1) {
                   Write-Host "Found VM: $($dataset.Tables[0].Rows[0].target_file)  and retain_date : $($dataset.Tables[0].Rows[0].retain_datetime)" -fore green  
                   $choice = ""
                    while ($choice -notmatch "[y|n]"){
                        $choice = read-host "Récap OK and GO ? (Y/N)"
                        }
if ($choice -eq "n"){
                        exit 0
                      }
                  $backupId = $dataset.Tables[0].Rows[0].backup_id
                  $sql = "UPDATE [Backup.Model.VeeamZIPRetention] SET [retain_datetime] = '{0}' WHERE [backup_Id] = '{1}'" -f $retainDateTime.ToString('yyyy-MM-dd HH:mm:ss'), $backupId
                  $cmd = New-Object System.Data.SqlClient.SqlCommand($sql,$SqlConnection)
                  $cmd.CommandTimeout = $QueryTimeout
                  $rowsAffected = $cmd.ExecuteNonQuery()
                  Write-Host "Affected rows $rowsAffected" -fore green
           }
elseif ($dataset.Tables[0].Rows.Count -eq 0){
             Write-Host "$($vmName) was not found" -fore red
             Write-Host "Affected rows 0" -fore red
           }
           else {
               Write-Host 'More than one file found :' -fore red
               foreach ($Row in  $dataset.Tables[0].Rows)
                    { 
                       Write-Host "Path file is : $($Row.target_file)" -fore DarkYellow
                    }
               Write-Host 'Retry with a more specific name' -fore Cyan
           }
}
        catch [System.Data.SqlClient.SqlException]  
        { 
            
            $Time=Get-Date 
             Write-Host
            write-Host "$Time : $_.Exception.Message" 
        } 
        Catch  
        {   
            $ErrorMessage = $_.Exception.Message
            Write-Output $ErrorMessage
            $Time=Get-Date
            write-Host "$Time : Connection failled. The error message was $ErrorMessage " 
            Break
        }
        finally 
        { 
               if ($SqlConnection.State -eq "Open") 
                { 
                    $SqlConnection.Close() 
                } 
        }   

Leave a Reply

Your email address will not be published. Required fields are marked *