Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tutoriel:sauvegarder_automatiquement_ses_bases_de_donnees [Le 25/06/2007, 03:09]
82.231.84.119
tutoriel:sauvegarder_automatiquement_ses_bases_de_donnees [Le 24/02/2023, 15:53] (Version actuelle)
85.14.130.61 [Création du script]
Ligne 1: Ligne 1:
-{{tag>dapper edgy feisty serveur ​tutoriel sgbd}}+{{tag>​tutoriel ​sauvegarde serveur ​sgbd mysql }}
  
 ---- ----
 + 
 +====== Sauvegarder automatiquement ses bases de données MySQL ======
  
-====== Sauvegarder automatiquement ses bases de données ​(MySQL) avec cron ======+Ce mini tutoriel vous présente une méthode simple pour mettre en place une sauvegarde automatique des bases de données ​de votre serveur [[:MySQL]]. Ce script doit être installé sur le serveur ​MySQL.
  
-Ce mini tutoriel vous présente une méthode simple de mettre en place une sauvegarde automatique des bases de données ​de votre serveur MySQL.+<note tip>Bien que le contenu ​de cette page reste valide, il est à noter que cette opération peut être réalisée directement avec un script fourni par votre distribution (depuis la version 9.10 inclue) : [[:​automysqlbackup]]. Cette méthode est généralement à préférer, car plus propre.</​note>​
  
 Pour ce faire, nous allons utiliser 2 scripts bash et les tâches cron. Pour ce faire, nous allons utiliser 2 scripts bash et les tâches cron.
Ligne 13: Ligne 15:
   * Nous nous connectons au serveur de base de données avec le login **root** et le mot de passe **monpass**.   * Nous nous connectons au serveur de base de données avec le login **root** et le mot de passe **monpass**.
  
-===== Pré-requis ===== +Attention : en aucun cas vous devez sauvegarder la base de données ​"à l'​état brute",​ depuis le répertoire /var/mysq/*. En effet, ​ce n'​est ​pas très portable et d'​autre part, si le serveur n'est pas arrêté, vous risquez d'​avoir des données non cohérentesA la place, en utilisant mysqldump, vous avez une extraction ASCII de vos données (que vous pouvez compresser),​ et surtout, ​un mécanisme de verrou sur les bases à chaque extraction (option -opt de mysqldump par défaut). Vous n'avez en principe pas besoin d'​arrêter le serveur.
-  * Avoir un serveur MySQL contenant des bases de données à sauvegarder (voir [[:​lamp|serveur LAMP]] ou [[:​MySQL]]) +
-  ​Une connaissance de ce qu'​est ​une tâche [[:​cron]] ​est un plus. +
-  * Savoir [[:​tutoriel:​comment_editer_un_fichier|éditer ​un fichier]]+
  
 +Pour sauvegarder les fichiers de votre site accessibles en ftp uniquement, voir avec [[:​lftp#​sauvegarde_sur_votre_ordinateur_de_votre_site_internet|lftp]]
  
  
 +===== Création du script =====
  
-===== Création des scripts ===== +Nous allons créer ​le script ​dans le répertoire **/​root/​scripts/​**(( ou /​user/​local/​bin … https://​askubuntu.com/​questions/​998452/​where-should-i-put-my-bash-scripts)). Seul root y aura accès en lecture (et écriture).
-Nous allons créer ​nos scripts ​dans le répertoire **/​root/​scripts/​**. Seul root y aura accès en lecture (et écriture).+
  
-==== Script de backup ==== +Si le sous répertoire ​script ​n'existe pas déjà, le créer ​
-Nous créons un premier ​script ​que l'on appellera **backup_bdd.sh** qui contient ​+<codesudo mkdir /​root/​scripts 
-<file> +</code>
-#​!/​bin/​bash +
-+
-## on se place dans le répertoire où l'on veut sauvegarder les bases +
-+
-cd /​root/​scripts/​backups/+
  
-for i in mon_site mon_forum mon_blog; do+Le script s'​appellera backup_bdd.sh et contient :
  
-## Sauvegarde ​des bases de données ​en fichiers .sql +<code bash>#!/​bin/​bash 
-mysqldump -uroot -pmonpass $i > ${i}_`date +%D | sed 's;/;​-;​g'​`.sql+Script de sauvegarde ​des bases de données ​mysql/mariadb 
 +# Les valeurs à paramétrer sont en fin de script dans la fonction main()
  
-## Compression des exports en tar.bz2 ​(le meilleur taux de compression+get_databases_to_backup() { 
-tar jcf ${i}_`date +%D | sed 's;/;-;​g'​`.sql.tar.bz2 ​${i}_`date +%D | sed 's;/;-;g'`.sql+    ​mysql_command=$(command ​-v mysql) 
 +    databases_list=$($mysql_command --defaults-file=/etc/​mysql/​debian.cnf ​-Bse 'show databases'​)
  
-## Suppression des exports non compressés +    for exclude in $databases_exclude_list 
-rm $i_`date +%sed 's;/;-;g'`.sql+    do 
 +       databases_list=${databases_list//​$exclude/​} 
 +    done 
 +
 +dump_databases () { 
 +    ext="​.sql.gz"​ 
 +    mysqldump_command=$(command -v mysqldump) 
 +    compress_command=$(command -v gzip) 
 +    current_date=$(date +%F_%Hh%M) 
 +    cd "​${backup_folder}" ​|| exit 
 +    for database in $databases_list 
 +    do 
 +        $mysqldump_command ​--defaults-file=/​etc/​mysql/​debian.cnf "​$database"​ | $compress_command ​ > "​${database}"​_"​${current_date}"​${ext} 
 +        echo "​Backing up database: ${database}…"​ 
 +    done
  
-done +    echo "​$(date +%c): Backup complete!"​ 
-</​file>​ +} 
-Mettez dans la ligne +delete_old_backups() { 
-<​file>​for i in mon_site mon_forum mon_blog; do</file> +    ​find_command=$(command -v find) 
-la liste de toutes les bases de données que vous voulez sauvegarder+    cd "​${backup_folder}"​ || exit 
 +    $find_command .-mtime +"​${delete_backups_older_than_days}"​ -type f -exec rm -v {}  \; 
 +}
  
-Par sécurité, on ne veut pas garder que la dernière sauvegarde faite (elle peut être corrompue). Nous insérons donc la date du jour dans le nom de fichier avec //`date +%D | sed 's;/;-;g'`// qui générera une date au format MM-JJ-AA+main() 
 +    # toujours exclure information_schema performance_schema de la sauvegarde sinon le script générera des erreurs  
 +    databases_exclude_list="​mysql phpmyadmin information_schema performance_schema"​ 
 +     
 +    # choix du dossier ​de destination des sauvegardes à ajuster à vos besoins 
 +    backup_folder="​/srv/mysql_backups"​ 
 +    if [ ! -d "​$backup_folder"​ ] then 
 +        mkdir -p "​$backup_folder"​ 
 +    fi
  
-Au final, si l'on exécute le script le 30 mai 2007, on obtiendra 3 archives : +    get_databases_to_backup 
-  * mon_site_05-30-07.sql.tar.bz2 +    ​dump_databases
-  * mon_forum_05-30-07.sql.tar.bz2 +
-  * mon_blog_05-30-07.sql.tar.bz2+
  
-Vous pensez bien qu'​après plusieurs semaines ou mois d'​utilisation,​ ce script aura généré une grande quantité ​de fichiers qui prendront de la place sur votre disque. Nous choisissons donc de ne garder que les 5 dernières ​sauvegardes ​de chaque base.+    # nombre ​de jours pendant lesquels il faut conserver ​les sauvegardes, -1 si illimité 
 +    delete_backups_older_than_days=1 
 +    if [ $delete_backups_older_than_days != "​-1"​ ] ; then 
 +        delete_old_backups 
 +    fi 
 +
 + 
 +main 
 + 
 +</​code>​
  
-Nous créons donc un second script qui va nettoyer le dossier en supprimant les sauvegardes vieilles de plus de 5 jours. 
  
-==== Script de nettoyage ==== 
-On nome ce fichier **clean_backups.sh** et son contenu est : 
-<​file>​ 
-#!/bin/bash 
-# 
-## Supprime les sauvegardes vieilles de plus de 5 jours 
-# 
-find /​root/​scripts/​backups/​ -type f -mtime +4 | xargs -r rm 
-</​file>​ 
  
 ===== Modification des permissions ===== ===== Modification des permissions =====
-Nous allons faire en sorte que seul root puisse lire,​exécuter,​ et modifier ​ces 2 scripts : +Nous allons faire en sorte que seul root puisse lire, exécuter, et modifier ​ce scripts : 
-  cd /​root/​scripts && sudo chmod 700 backup_bdd.sh ​clean_backups.sh+  cd /​root/​scripts && sudo chmod 700 backup_bdd.sh 
 + 
  
 ===== Programmation de l'​exécution des scripts avec Cron ===== ===== Programmation de l'​exécution des scripts avec Cron =====
 +
 +FIXME Consulter la page [[:cron]] où il est préconisé d'​utiliser <code bash>​crontab -e</​code>​ pour modifier les CRON, les infos ci-dessous, si elles ne sont pas obsolètes, ne semble plus recommandées!
 +
 +
 Dans le répertoire **/etc**, vous pouvez voir qu'il existe des répertoires cron.daily, cron.hourly,​ etc Dans le répertoire **/etc**, vous pouvez voir qu'il existe des répertoires cron.daily, cron.hourly,​ etc
  
 dans le fichier **/​etc/​crontab**,​ est notée la fréquence de lancement des tâches cron. Vous pouvez voir que le contenu du répertoire **cron.daily** est exécuté par défaut tous les jours à 6h25. vous pouvez modifier l'​horaire si vous le souhaitez. Par exemple en y mettant l'​heure où votre site est le moins fréquenté (en général vers 3h du matin). Pour plus d'​informations sur la programmation des tâches cron consultez la page sur [[:cron]]. dans le fichier **/​etc/​crontab**,​ est notée la fréquence de lancement des tâches cron. Vous pouvez voir que le contenu du répertoire **cron.daily** est exécuté par défaut tous les jours à 6h25. vous pouvez modifier l'​horaire si vous le souhaitez. Par exemple en y mettant l'​heure où votre site est le moins fréquenté (en général vers 3h du matin). Pour plus d'​informations sur la programmation des tâches cron consultez la page sur [[:cron]].
  
-Donc comme nous l'​avons dit, les scripts contenus dans le répertoire cron.daily seront exécutés à l'​heure définie dans crontab. Nous allons donc y placer ​des liens vers nos 2 scripts en utilisant une notation à chiffres pour être sûr qu'ils seront exécutés dans l'​ordre ​:+Donc comme nous l'​avons dit, les scripts contenus dans le répertoire cron.daily seront exécutés à l'​heure définie dans crontab. Nous allons donc y placer ​un lien vers notre script  ​:
   cd /​etc/​cron.daily   cd /​etc/​cron.daily
   sudo ln -s /​root/​scripts/​backup_bdd.sh 01-backup_bdd   sudo ln -s /​root/​scripts/​backup_bdd.sh 01-backup_bdd
-  sudo ln -s /​root/​scripts/​clean.sh 02-clean_backups 
  
->Bien sûrsi vous avez déjà des scripts numérotés,​ incrémentez les numéros en fonction de ceux-ci...+ 
 +<note important> 
 +Surtout ne faites pas de lien symbolique avec un point "​."​ dans le nom du liencelui-ci ne serait pas exécuté et cron ne log pas cette non exécution. 
 +</​note>​
  
 C'est fini :) C'est fini :)
Ligne 96: Ligne 122:
 ---- ----
  
- --- //​Contributeurs : [[:​utilisateurs:​_Enchained]]//​+ //​Contributeurs : [[:​utilisateurs:​_Enchained]], [[:​utilisateurs:​_bruno]]//
  • tutoriel/sauvegarder_automatiquement_ses_bases_de_donnees.1182733751.txt.gz
  • Dernière modification: Le 18/04/2011, 14:50
  • (modification externe)