SIO2ème année SISR3 Page 1 TP Sauvegarde/Restauration de Base de Données Contexte : L'entreprise GSB voir Annexe1 Application concernée : L'application gestion des frais et remboursements pour les visiteurs médicaux est en cours de développement, une première version opérationnelle est installée sur un serveur ou autre. A votre disposition : une machine virtuelle comprenant l'application avec Apache et la base de données gsb_frais sous Mysql un serveur FTP vers lequel se fera une copie de la sauvegarde Votre mission : Automatiser la sauvegarde de la base de données gsb_frais en suivant les étapes suivantes : Etape 1 : Ecrire le script bash, tester (sauvegarde du bash dans le répertoire root de linux, création d'un utilisateur mysql, compression) Etape 2 : Création de fichiers de log Etape 3 : Sauvegardes périodiques : planification avec cron Etape 4 : Stratégie de sauvegarde Etape 5 : sauvegarde distante : les solutions? Mise en place transfert vers FTP Etape 6 : tests et écrire une procédure de restauration, envisager les différents scénarios (restauration sur le même sgbd, seule l'intégrité de la base a été touchée, sauvegarde sur nouveau serveur).
SIO2ème année SISR3 Page 2 Etape1 : Ecriture du fichier bash de sauvegarde L'exécution du fichier bash sera réalisé par l'administrateur du serveur Linux (compte root). Le compte utilisé dans Mysql sera un compte spécifique à créer Dans Mysql créer le compte Mysql : usauv Mdp : usauv //entrer dans la base #mysql u root p #password : password //créer un utilisateur CREATE USER usauv @'localhost' IDENTIFIED BY usauv ; #mysql u usauv p #password : usauv Lui attribuer les privilèges données suivants : select et les privilèges administration suivants : showdatabase, lockdatabase. //lui accorder des privilèges GRANT SELECT ON *. * TO ' usauv '@'localhost' IDENTIFIED BY ' usauv '; GRANT SHOW DATABASES ON *. * TO ' usauv '@'localhost' IDENTIFIED BY 'usauv'; GRANT LOCKDATABASE ON *. * TO ' usauv '@'localhost' IDENTIFIED BY ' usauv '; Créer SI BESOIN les répertoires suivants : Répertoire de stockage du bash : /root/bash //mkdir permet de crée un fichier ou dossier #mkdir /root/bash Répertoire de destination de la sauvegarde locale : /var/sauvbd #mkdir /var/sauvbd Répertoire d'accueil des logs /var/log/mysql #mkdir /var/log/mysql // Le fichier existe Tester la commande mysqldump (annexe) : lister les paramètres indispensables, explorer - - opt et - - verbose. Pour sauvegarder (dump) une base mysql dans un fichier texte on utilise la fonction mysqldump : La syntaxe de la commande mysqldump est la suivante : mysqldump [OPTIONS] ma_base_de_donnee [ma_table1, ma_table2,...] Voici la ligne de commande pour sauvegarder la base entière : mysqldump -u login -p password -h nom_serveur_rmysql --opt nom_base > sauvegarde_de_ma_base.sql Voici la ligne de commande pour sauvegarder une table de la base : mysqldump -u login -p password -h nom_serveur_rmysql --opt nom_base nom_table > sauvegarde_dune_seule_table_de_la_base.sql L'argument --opt permet entre autres d'exporter la structure de la table, de mettre à jour les données en écrasant la table. Vous devez sauvegarder la base gsb_frais par exemple. Le fichier de destination sera gsb_frais.sql. Editer le fichier.sql et vérifier!
SIO2ème année SISR3 Page 3 1- Créer la base de donné a. > CREATE DATABASE gsb_frais; 2- Sauvegarder la base gsb_frais a. mysqldump -u usauv -p -h localhost --opt gsb_frais > /var/sauvbd/gsb_frais.sql // La base a bien était créer Ecrire le script sauv_bd_frais commenté et utilisant des variables permettant de sauvegarder la base et de compresser le fichier gsb_frais.sql généré (gzip). Rendre exécutable votre script, le tester! ------------------------------------[ pour sauvegarder UNE BASE de MYSQL]--------------------------------------- -----SCRIPT SHELL----- #!/bin/bash # VARIABLES # #la date du jour DATE=`date +%y_%m_%d` #variable qui appelle ma base de donné «gsb_frais» base=gsb_frais #affiche «Début de sauvegarde» echo "Début de la sauvegarde #affiche «sauvegarde de «gsb_frais» echo "Sauvegarde de $base..." #savegarde la base de donné dans un fichier avec la date du jour sous format gzip mysqldump -uroot -ppassword "$base" gzip > /var/sauv_bd_frais/$base.$date.sql.gz #affiche «Sauvegarde terminer» echo "Sauvegarde terminée" ###FIN### --------------------------[ FIN pour sauvegarder UNE BASE de MYSQL]---------------------------
SIO2ème année SISR3 Page 4 [AUTRE POSSIBILITE] --------------------------[ pour sauvegarder TOUTES LES BASES de MYSQL]--------------------------------- -----SCRIPT SHELL----- #!/bin/bash # VARIABLES # #la date du jour DATE=`date +%y_%m_%d` #Utilisateurs mysql_user=root #Password mysql_pass=password ########## ###DEBUT### #Connexion à MYSQL + lister toutes les bases de donnés bases=`mysql -u $mysql_user --password=$mysql_pass -e "show databases;" -B -s` #Vérifier si la base n est pas vide if [ -z "$bases" ];then echo "Erreur d'accès ou pas de bases" " >> /var/log/mysql/sauv_bd.$date.log exit 1 fi #si aucune erreur la sauvegarde peut commencer echo "Début de la sauvegarde" " >> /var/log/mysql/sauv_bd.$date.log for base in $bases do #savegarde chaque base de donné dans un fichier avec la date du jour sous format gzip echo "Sauvegarde de $base..." " >> /var/log/mysql/sauv_bd.$date.log mysqldump -u $mysql_user --password=$mysql_pass "$base" gzip > /var/sauvbd/$base.$date.sql.gz done echo "Sauvegarde terminée" " >> /var/log/mysql/sauv_bd.$date.log ###FIN### --------------------------[ FIN pour sauvegarder TOUTES LES BASES de MYSQL]---------------------------
SIO2ème année SISR3 Page 5 Etape 2 : Création de fichiers de log Vous allez réaliser un fichier de log dans le répertoire /var/log/mysql/ Le fichier aura dans un premier temps pour nom : sauv_bd_frais.log Il se fera par redirection des messages affichés (utilisation de >) vers ce fichier. #mkdir /var/log/mysql/sauv_bd_frais.log Exemple : Date > /var/log/mysql/sauv_bd_frais.log Tester la connexion à MySQL avec un show databases, ce servir de cette commande pour rediriger un message vers le fichier de log. Exemple (qui n'est pas forcément à suivre!!!): bases='mysql host=$mysql_server user=$mysql_user password=$mysql_pass ''show databases ;'' - B -s' if [-z ''$bases'' ];then echo ''Erreur d'accès mysql'' >> /var/log/mysql/sauv_bd_frais.log exit 1 fi;' Rediriger des affichages echo tout au long de votre script selon les différentes étapes ------------------------------------[ pour sauvegarder UNE BASE de MYSQL]--------------------------------------- -----SCRIPT SHELL----- #!/bin/bash # VARIABLES # #la date du jour DATE=`date +%y_%m_%d` #variable qui appelle ma base de donné «gsb_frais» base=gsb_frais #affiche «Début de sauvegarde» echo "Début de la sauvegarde" >> /var/log/mysql/sauv_bd_frais.$date.log #affiche «sauvegarde de «gsb_frais» echo "Sauvegarde de $base..." >> /var/log/mysql/sauv_bd_frais.$date.log #savegarde la base de donné dans un fichier avec la date du jour sous format gzip mysqldump -uroot -ppassword "$base" gzip > /var/sauv_bd_frais/$base.$date.sql.gz #affiche «Sauvegarde terminer» echo "Sauvegarde terminée" >> /var/log/mysql/sauv_bd_frais.$date.log ###FIN### --------------------------[ FIN pour sauvegarder UNE BASE de MYSQL]---------------------------
SIO2ème année SISR3 Page 6 Mettre en place, tester, chercher la signification de z L option «-z» permet de tester si une chaine est vide ou pas Grâce à l'annexe 2, travailler sur la redirection des messages d'erreurs echo "Début de la sauvegarde" >> /var/log/mysql/sauv_bd_frais.$date.log echo "Sauvegarde de $base..." >> /var/log/mysql/sauv_bd_frais.$date.log echo "Sauvegarde terminée" >> /var/log/mysql/sauv_bd_frais.$date.log Réfléchir à l'historisation des logs «DATE» + «Echo» Etape 3 : Sauvegardes périodique : planification avec cron Le daemon (service) cron permet de lancer automatiquement des commandes à un horaire fixe. La liste des tâches d'administration du système nécessitant une exécution régulière peut être consultée ou modifiée en éditant le fichier /etc/crontab. #nano /etc/crontab Exemple de fichier /etc/crontab : (Voir aussi Annexe 3) SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron ( cd / && run-parts --report /etc/cron.monthly ) 00 01 * * * root /root/scripts/scan_virus Complétez la "crontab" de façon à ce que la sauvegarde s'effectue tous les jours, dans 5 minutes. Tester (min h jour mois anné utilisateur commande) */5 * * * * root /root/bash/sauv_bd_frais.sh #Sauvegarde toutes les 5 minutes Etape 4 : Stratégie de sauvegarde Mettre en place une stratégie de sauvegarde mensuelle, hebdomadaire, journalière (min h jour mois anné utilisateur commande) 30 23 * * * * root /root/bash/sauv_bd_frais.sh #Sauvegarde toutes les jours à 23h30 Faire une proposition justifiée et rédigée aux enseignants J ai choisi de faire une sauvegarde journalière à 23h30 pour la simple raison que si on a une base de donné qui fait des mises à jour tout les jours on aura donc un backup à 23h30 du jour avant. Réaliser si nécessaire plusieurs bash de sauvegarde, modifier le(s) bash(s) existant(s) Savegarde de toutes les bases de donnés qui se trouve dans MYSQL (voir script plus haut) Réfléchir à la problématique d'écrasement des sauvegardes (ne faut-il pas conserver plusieurs sauvegardes en gérant des fichiers différents et les dates? (utiliser l'annexe 4 sur la commande Date) mysqldump -uroot -ppassword "$base" gzip > /var/sauv_bd_frais/$base.$date.sql.gz Cette ligne permet de sauvegarder une base de donnée et de rediriger la sauvegarde vers le chemin indiqué avec la date du jour donc chaque jours aura un fichier de sauvegarde compressé.
SIO2ème année SISR3 Page 7 Etape 5 : sauvegarde distante Lister les différentes solutions envisageables pour déporter la sauvegarde sur un serveur distant. -par FTP -par SSH -par TELNET Test du serveur FTP : vous avez à votre disposition un serveur FTP sur le Synology d'adresse 172.20.111.11 #apt-get install proftpd un compte etu-si7 (mdp : etu-si7) vous permet le contrôle total sur le home de ce compte #compte : ilyes password : password pour les besoins du TP dans un premier temps, vous testerez l'accès à ce FTP et créerez un répertoire à votre nom avec un client ftp quelconque # /home/ilyes (Mon dossier est Ilyes) Compléter votre script de sauvegarde avec le transfert FTP grâce à la commande ftp (voir annexe 4). De façon générale vos transferts se feront dans votre répertoire, avec ou non des sous-répertoires (a créer ou non) selon la stratégie de sauvegarde que vous avez mis en place. test ping serveur : ping -c 1 $serveur 1> /dev/null if [ $? -ne 0 ] ; then echo $serveur innaccessible exit 1 fi Etape 6 : procédure de restauration Ecrire une procédure de sauvegarde, celle-ci doit clairement envisagé plusieurs scénarios : restauration sur le même serveur mysql, seule l'intégrité de la base a été touchée #mysql u usauv pusauv < /var/sauv_bd_frais/gsb_frais.sql sauvegarde sur nouveau serveur mysql (mysql est réinstallé, mais pas la base, pas les comptes etc )