
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 :
Invoke-WebRequest -Uri "https://aka.ms/vs/16/release/vc_redist.x64.exe" -OutFile "C:\temp\vc_redist.x64.exe"
Installation :
Start-Process -FilePath "C:\Path\To\vc_redist.x64.exe" -ArgumentList '/install', '/quiet', '/norestart' -Wait
B – Téléchargement et installation de MySQL
- Téléchargement :
Invoke-WebRequest -Uri "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36 winx64.zip" -OutFile "C:\temp\mysql.zip"
- Décompression :
Expand-Archive -LiteralPath "C:\temp\mysql.zip" -DestinationPath "C:\temp"
- Déplacement de dossier vers le répertoire dans lequel sera installé MySQL :
Move-Item -Path "C:\temp\ mysql-8.0.36-winx64" -Destination "C:\var\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 :
.\bin\mysqld --initialize-insecure –console
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 :
.\bin\mysqld –install
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 :
mysql -u root -p
Appuyer sur entrer dans le vide
Création d’un nouveau mot de passe :
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Votre-New-MDP';
Appliquer les changements :
FLUSH PRIVILEGES;
Création d’une nouvelle base appelée « produits_db » :
CREATE DATABASE produits_db;
Sélection de la base :
USE produits_db ;
Création d’une table appelé « produits » :
CREATE TABLE produits (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(255) NOT NULL,
prix DECIMAL(10, 2) NOT NULL
);
Insertion de données dans la table « produits » :
INSERT INTO produits (nom, prix) VALUES ('Ordinateur', 799.99);
INSERT INTO produits (nom, prix) VALUES ('Téléphone', 299.99);
INSERT INTO produits (nom, prix) VALUES ('Tablette', 399.99);
Affichage du contenu de la table « produits » :
SELECT * FROM produits;
Création d’un compte pour effectuer les sauvegardes :
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'Le_Mot_De_Passe';
Attribution des droits sur la base_db :
GRANT SELECT, LOCK TABLES ON nom_de_la_base.* TO 'backup_user'@'localhost';
Application des changements :
FLUSH PRIVILEGES;
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 :
# Variables de configuration
$taskName = "DailyPowerShellScript"
$scriptPath = "C:\votredossier\sauvegarde.ps1" # Remplacez par le chemin de votre script
$executionTime = "09:00" # Heure d'exécution quotidienne (format HH:mm)
# Créer une action pour exécuter le script PowerShell
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File `"$scriptPath`""
# Créer un déclencheur quotidien
$trigger = New-ScheduledTaskTrigger -Daily -At $executionTime
# Créer la tâche planifiée
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest
# Vérifier si la tâche a été créée avec succès
if (Get-ScheduledTask -TaskName $taskName) {
Write-Output "La tâche planifiée '$taskName' a été créée avec succès."
} else {
Write-Output "Échec de la création de la tâche planifiée '$taskName'."
}