Je me suis retrouvé face à une problématique simple « Défaut d’espace disque sur le serveur SQL dédié à la compta ».

Mes bases SQL étaient tellement importante que je ne pouvais avoir qu’une seul journée de rétention. J’ai mis en place, en plus du plan de maintenance, deux scripts Powershell.

Mon premier script powershell compresse tous les fichiers avec l’extension « .bak »  et le second supprime tous les fichiers « .7z »  dont la dernière modification date de 3 jours.

Scénario :

Les bases SQL du serveur de comptabilité doivent être sauvegardé tous les soirs. Le dump (sauvegarde) des bases représente désormais 40 Go en plus des 40 Go de bases existantes. Les sauvegardes de base SQL une fois compressé ne prennent plus que 5 GO.

La machine virtuelle hébergeant les bases a une capacitée disque de 100 GO. Un système de lecteur de bande sauvegarde le contenu du répertoire de sauvegarde pour une rétention d’environ 6 mois. Cependant celui-ci n’est pas très fiable en ce moment et peux défaillir jusqu’à 2 fois de suite.

J’ai donc besoin de compresser mes bases et d’avoir une rétention de plus de trois jours, cela  permet de ne pas déborder la capacité disque et de palier à la défaillance de mes bandes.

40 + 40 + (3*5) =   95 < 100

Plan de maintenance SQL.

J’utilise SQL serveur 2005 pour héberger les bases de ma solution SAGE. Via management studio, il vous est possible de gérer un plan de maintenance, je n’exposerai que deux de mes nombreuses tâches. Le plan de maintenance ce situe dans « Gestion > Plan de maintenance« .

Sauvegarde des bases total

La sauvegarde complète est effectuée dans le répertoire « D:Microsoft SQL ServerBackup_SL »

Automatiquement un répertoire est crée pour chaque base au nom de la base. Chaque dump (sauvegarde) aura comme extension « .bak »

Nettoyage Historique :

Afin de ne pas engorger le serveur de sauvegarde volumineuse, je supprime chaque dump qui à une date de création de plus d’une heure. Cela n’empêchera pas d’avoir à un moment X un taux d’occupation proche du max autorisé. Ce paramètre sera à contrôler régulièrement.

Script d’archivage :

<#   
Le script compresse tous les fichiers .bak {sauvegarde sql} dans leur dossier courant et les transforme en fichier .7zip. 
#> 

#### http://mats.gardstad.se/matscodemix/2009/02/05/calling-7-zip-from-powershell/  
# Alias for 7-zip 
if (-not (test-path "$env:ProgramFiles7-Zip7z.exe")) {throw "$env:ProgramFiles7-Zip7z.exe needed"} 
set-alias sz "$env:ProgramFiles7-Zip7z.exe" 

############################################ 
#### Variables  

$filePath = "D:Microsoft SQL ServerBackup_SQL" 

$bak = Get-ChildItem -Recurse -Path $filePath | Where-Object { $_.Extension -eq ".bak" } 

########### END of VARABLES ################## 

foreach ($file in $bak) { 
                    $name = $file.name 
                    $directory = $file.DirectoryName 
                    $zipfile = $name.Replace(".bak",".7z") 
                    sz a -t7z "$directory$zipfile" "$directory$name"      
                } 

########### END OF SCRIPT ##########

Le script Powershell compresse au format 7zip tous les fichiers « .bak » dans leur dossier courant à partir de l’arborescence « D:Microsoft SQL ServerBackup_SQL »

Script de nettoyage d’archive :

get-childitem -path 'D:Microsoft SQL ServerBackup_SQL' -Recurse -include *.7z | ?{$_.lastwritetime -lt [datetime]::now.adddays(-3)} | Remove-Item -Force

Le script Powershell cherche de manière récursive à partir du répertoire « D:Microsoft SQL ServerBackup_SQL »  toutes les extensions au format « .7z » ayant 3 jours d’ancienneté depuis sa date de modification puis les supprimes.

 Planning

Création de deux tâches planifiée, les script Powershell sont au format .ps1

1)  La sauvegarde SQL est lancé à :             21 H                 Durée 15 minutes.

2)  Archive SQL :                                                21 h 20                  1 h 15 minutes.

3)  Nettoyage Archive :                                     22 h 50                            2 minutes.

4) Nettoyage BD :                                              23 h 00                            2 minutes

5 ) Sauvegarde via Bande :                             00h 15                             7 h 00

 

Comme je suis encore en phase de test je me suis laissé de la marge entre la tâche 4 et la 5. Je veux être sûr qu’un autre événement ne viendra pas ralentir l’archivage.

A savoir que l’archivage alterne successivement d’un processeur à l’autre et qu’une autre action sur le serveur peux occuper les deux processeurs. ceci provoque obligatoirement un allongement de la durée de la sauvegarde.

Si vous avez d’autre solution ou même des questions n’hésitez pas !!