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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#################################################################################################################################################################### # 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() } } |