PowerShell : Automatiser la Sauvegarde Quotidienne d’une Base MySQL et Notifier l’Administrateur du déroulement de l’opération

Objectif

L’objectif est de réaliser automatiquement la sauvegarde quotidienne d’une base de données MySQL et d’envoyer une notification à l’administrateur pour l’informer du succès ou de l’échec de l’opération.

Synopsis

Nous disposons de deux serveurs sous Windows Server 2019 : l’un pour le système de gestion de base de données (SGBD) et l’autre pour les sauvegardes, les deux étant membres d’un même domaine. Le serveur de sauvegarde, nommé CBACK, exécute quotidiennement un script PowerShell. Ce script, une fois lancé, effectue une sauvegarde d’une base de données MySQL appelée « produits_db », qui se trouve dans le serveur « CBDD », et stocke la sauvegarde dans le répertoire C:\backmysql sur CBACK avec le nom de la base accompagné de la date du jour et l’heure à laquelle la sauvegarde est effectuée. Une fois l’opération terminée, un mail est envoyé automatiquement à l’administrateur système pour lui notifier le déroulement de l’opération. Cette notification informera l’administrateur de la réussite ou de l’échec de la sauvegarde.

Prérequis

MySQL doit être installé sur les deux serveurs : le serveur MySQL sur CBDD et le client MySQL sur CBACK, ou bien le serveur MySQL doit être installé sur les deux serveurs.

Partie I : Installer et Configurer MySQL

Sur « CBDD » :

A – Installation des Prérequis de MySQL : Visual Studio 2016 et Visual C++ 2019

Lancez PowerShell avec les privilèges d’Administrateur et entrez les commandes suivantes. Assurez-vous que les répertoires dans lesquels seront stockés les fichiers téléchargés ainsi que les fichiers des programmes sont déjà créés. Dans cet exemple, nous stockerons les fichiers téléchargés dans le répertoire « C:\temp » et « C:\var » pour l’installation des programmes.

  • Visual C++ 2019

Téléchargement :

Installation :

B – Téléchargement et installation de MySQL

  • Téléchargement :
  • Décompression :
  • Déplacement de dossier vers le répertoire dans lequel sera installé MySQL  :
  • Installation :

D’abord, sur PowerShell, rendez-vous sur le répertoire où se trouve le dossier MySQL et où celui-ci sera installé (cd C:\var\MySQL ; pour notre cas), ensuite tapez la commande suivante :

Cette commande configure MySQL avec un accès root sans mot de passe et affiche les messages de sortie dans la console, ce qui est utile pour le suivi de l’initialisation.

La commande suivante lance l’installation de MySQL :

Démarrage de MySQL :

Start-Service mysql

Rendre MySQL accessible depuis n’importe quel emplacement pour tous les utilisateurs (remplacer votre « C:\var\MySQL\bin » par le répertoire auquel est installé MySQL sur votre machine) :

[System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine) + ";C:\var\MySQL\bin", [System.EnvironmentVariableTarget]::Machine)

Accès à MySQL :

Appuyer sur entrer dans le vide

Création d’un nouveau mot de passe :

Appliquer les changements :

Création d’une nouvelle base appelée « produits_db » :

Sélection de la base :

Création d’une table appelé « produits » :

Insertion de données dans la table « produits » :

Affichage du contenu de la table « produits » :

Création d’un compte pour effectuer les sauvegardes :

Attribution des droits sur la base_db :

Application des changements :

C – Préparation du script

Le script sera organisé en 3 parties :

  • La première consistera à lancer la commande « mysqldump » pour lancer la sauvegarde de la base « produits_db » afin de l’enregistrer dans le répertoire « C:\back » avec la date du jour et l’heure à laquelle la sauvegarde a été effectué.
  • La deuxième consistera à déclencher l’envoi d’un mail de notification qui partira de l’adresse « mdb_back@sayoos.net » d’un compte smtp ionos pour une quelconque adresse. L’adresse « mdb_back@sayoos.net » notifiera l’adresse de destination de l’échec ou de la réussite de l’opération.

Le script :

# Paramètres de connexion MySQL
$dbServer = "192.168.1.102"
$dbUser = "adm_back"
$dbName = "produits_db"

<# Emplacement et nom du fichier de sauvegarde – veuillez à créer répertoire pour le stockage des sauvegardes sur votre PC avant de continuer
#>

# Format de date et heure pour le nom de fichier (exemple : 20230405-153020)
$dateTimeForFileName = Get-Date -Format "yyyyMMdd-HHmmss"
$backupFile = "C:\Backupmysql\$dbName-$dateTimeForFileName.sql"  

<# Paramètres SMTP pour l'envoi d'email pour un serveur de chez Ionos qui utilise 587 comme numéro de port.
#>

$smtpServer = "smtp.ionos.fr"
$smtpPort = 587
$smtpUser = "mdb_back@sayoos.net"  
$mailFrom = "mdb_back@sayoos.net"  
$mailTo = "adm_back@gmail.com"   
$mailSubjectSuccess = "Succès de la sauvegarde MySQL"   
$mailSubjectFailure = "Échec de la sauvegarde MySQL"   
$mailBodySuccess = "La sauvegarde de la base de données a été réalisée avec succès."   
$mailBodyFailure = "La sauvegarde a échoué."

try {
    # Commande mysqldump pour sauvegarder la base de données
    mysqldump -u $dbUser -p$dbPass -h $dbServer $dbName > $backupFile
    if (!$?) { throw "La commande de sauvegarde a échoué." }
    $mailSubject = $mailSubjectSuccess
    $mailBody = $mailBodySuccess
}

catch {
    $mailSubject = $mailSubjectFailure
    $mailBody = $mailBodyFailure
}

# Envoi d'email de notification
$smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort)
$smtp.Credentials = New-Object System.Net.NetworkCredential($smtpUser, $smtpPass)
$msg = New-Object Net.Mail.MailMessage($mailFrom, $mailTo, $mailSubject, $mailBody)
$smtp.Send($msg)

Bonus

Planification de l’exécution du script

Nous y sommes, le script pour notre sauvegarde est désormais prêt, il ne reste plus que la planification de son exécution.

Pour ce faire, nous avons deux choix : configurer son exécution à partir du planificateur de tâche de Windows (le fameux taskschd.msc), ou bien opter pour un mini script en PowerShell (ce dont nous allons opter).

Ci-dessous le script pour planifier l’exécution quotidienne de notre fichier :

Partager

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *