Batch de sauvegarde avec rotation automatique des fichiers, backup mssql et copie vers le réseau!
Aujourd’hui nous allons mettre en place une sauvegarde automatique par batch d’une base de donnée MSSQL avec une rotation sur les fichiers (pour éviter de les accumuler) et qui sera compatible windows XP/2000!
Je veux que le script génère un fichier daté, qu’il ne conserve que les 10 dernières backup sur le serveur, copie les sauvegardes sur un serveur de backup et conserve 30 jours de fichiers sur celui ci.
- Récupération de la date courante avec conversion au format US:
set date_today=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
Explication:
%DATE% retourne la date courante au format « JJ/MM/AAAA » ex: « 17/07/2018 »
Nous déplaçons notre curseur à la position x et récupérons les n caractères à partir de cette position
1 | 7 | / | 0 | 7 | / | 2 | 0 | 1 | 8 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
- %DATE:~6,4% curseur en position 6 et récupérons 4 caractères.
- %DATE:~3,2% curseur en position 3 et récupérons 2 caractères.
- %DATE:~0,2% curseur en position 0 et récupérons 2 caractères.
sqlcmd -SMonServeur\MaBDD -E -Q "BACKUP DATABASE MaBdd TO DISK = N'C:\BackupBDD\MaBackup_%date_today%.bak' WITH NOFORMAT, INIT, NAME = N'MaBdddb', SKIP, NOREWIND, NOUNLOAD, STATS = 1"
Explication:
On instancie une connexion à la base de donnée avec la commande sqlcmd, il faut retenir l’option -S qui prend en compte le serveur et la base de donnée sur laquelle on veut faire le dump. L’option -Q permet de faire une requête (le dump). Si vous voulez plus d’informations allez consulter le site microsoft (lien)
REM on monte le lecteur reseau pour envoyer le backup net use z: \\monIP\Monrepertoire z: cd MonSousRepertoire xcopy /E /Y C:\BackupBDD\MaBackup_%date_today%.bak .
Explication:
L’instruction REM est un commentaire 🙂
Pour monter le lecteur réseau on utilise net use suivi du nom du lecteur que l’on veut attribuer (vérifier qu’il est bien disponible et non utilisé!), puis le chemin là ou l’on doit se positionner pour la copie.
On « entre » dans ce lecteur z: et je décide de placer la sauvegarde dans un sous répertoire existant (c’est la vie c’est comme ça!)…j’utilise « cd »
Puis viens le tour de la copie du fichier avec l’instruction xcopy
- /E: pour copier les répertoires et sous répertoires (pas vraiment utile ici, mais bon à savoir!)
- /Y: remplace les fichiers déjà existant sans demander la confirmation
xcopy SOURCE DESTINATION, ici notre destination est l’endroit où l’on s’est positionné (sur le serveur distant), donc on met le « . »
FORFILES /p C:\BackupBDD\ /m *.bak /d -10 /c "CMD /C ERASE /F @FILE : purge 10 jours"
Explication:
On utilise l’instruction ‘FORFILES’ qui permet de parcourir un emplacement et pour un masque de fichier d’exécuter une commande en fonction de sa date. Ici on veut supprimer tous les fichiers avec l’extension .bak agés de plus de 10 jours! (je ne suis pas antivieux pourtant!)
- /p: chemin vers le répertoire où l’on veut faire le traitement
- /m: masque de fichier, ici tous les fichiers (*) qui ont pour extension « bak »
- /d: date de dernière modification supérieure à 10 jours
- /c: la commande que l’on veut exécuter (CMD /C: commande spécifiée entre guillemets, ERASE: effacer, /F: force la suppression des fichiers en lecture seule, @FILE: retourne le nom de chaque fichier parcouru par FORFILES)
C: net use z: /delete /Y
Explication:
On se replace sur le lecteur « C: » et on supprime le montage du lecteur réseau.
N’oubliez pas de mettre la rotation automatique AUSSI pour le lecteur réseau z: que vous avez monté précédemment, il suffit juste de changer le chemin, le reste de la commande est la même.
Vous n’avez plus qu’à tout mettre dans un fichier avec une extension .bat
Créer la tâche planifiée pour l’exécution automatique.
Et dire merci 😛
PS: si vous êtes sur XP 32 bits….forfiles n’existe pas, il faut le récupérer et le mettre dans c:\windows\system32\ le voici:Forfiles