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édentesRévision précédente
Prochaine révision
Révision précédente
tutoriel:sauvegarder_automatiquement_ses_bases_de_donnees [Le 27/02/2011, 18:31] johndescstutoriel:sauvegarder_automatiquement_ses_bases_de_donnees [Le 25/03/2026, 02:16] (Version actuelle) – +tag vétuste / à supprimer krodelabestiole
Ligne 1: Ligne 1:
-{{tag>dapper serveur tutoriel sauvegarde sgbd}}+{{tag>tutoriel sauvegarde serveur sgbd mysql vétuste à_supprimer}}
  
 ---- ----
- + 
- +
 ====== Sauvegarder automatiquement ses bases de données MySQL ====== ====== Sauvegarder automatiquement ses bases de données 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. +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 script doit être installé sur le 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>+<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 20: Ligne 17:
 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érentes. A 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. 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érentes. A 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.
  
 +Pour sauvegarder les fichiers de votre site accessibles en ftp uniquement, voir avec [[:lftp#sauvegarde_sur_votre_ordinateur_de_votre_site_internet|lftp]]
  
-Pour sauvegarder les fichiers de votre site accessibles en ftp uniquement, voir avec [[http://doc.ubuntu-fr.org/lftp#sauvegarde_sur_votre_ordinateur_de_votre_site_internet|lftp]] 
  
-===== Création des scripts ===== +===== Création du script =====
-Nous allons créer nos scripts dans le répertoire **/root/scripts/**. Seul root y aura accès en lecture (et écriture).+
  
-Nous créons un premier script que l'on appelera backup_bdd.sh qui contient :+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).
  
 +Si le sous répertoire script n'existe pas déjà, le créer :
 +<code> sudo mkdir /root/scripts
 +</code>
  
-<code>#!/bin/bash +Le script s'appellera backup_bdd.sh et contient :
-+
-## on se place dans le repertoire ou l'on veut sauvegarder les bases +
-+
-cd /root/scripts/backups/+
  
-for i in mon_site mon_forum mon_blog; do+<code bash>#!/bin/bash 
 +# Script de sauvegarde des bases de données mysql/mariadb 
 +# Les valeurs à paramétrer sont en fin de script dans la fonction main()
  
-## Sauvegarde des bases de donnees en fichiers .sql +get_databases_to_backup() { 
-mysqldump -uroot -pmonpass $i > ${i}_`date +"%Y-%m-%d"`.sql+    mysql_command=$(command -v mysql) 
 +    databases_list=$($mysql_command --defaults-file=/etc/mysql/debian.cnf -Bse 'show databases')
  
-## Compression des exports en tar.bz2 (le meilleur taux de compression+    for exclude in $databases_exclude_list 
-tar jcf ${i}_`date +"%Y-%m-%d"`.sql.tar.bz2 ${i}_`date +"%Y-%m-%d"`.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
  
-## Suppression des exports non compresses +    echo "$(date +%c): Backup complete!" 
-rm ${i}_`date +"%Y-%m-%d"`.sql+
 +delete_old_backups() { 
 +    find_command=$(command -v find) 
 +    cd "${backup_folder}" || exit 
 +    $find_command ./ -mtime +"${delete_backups_older_than_days}" -type f -exec rm -v {}  \; 
 +}
  
-done +main() { 
-</code> +    # 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" 
-Mettez dans la ligne +     
- +    # choix du dossier de destination des sauvegardes à ajuster à vos besoins 
-<code>for i in mon_site mon_forum mon_blog; do</code> +    backup_folder="/srv/mysql_backups" 
- +    if [ ! -d "$backup_folder" ] ; then 
-la liste de toutes les bases de données que vous voulez sauvegarder.+        mkdir -p "$backup_folder" 
 +    fi
  
-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 +"%Y-%m-%d"` qui générera une date au format AAAA-MM-JJ.+    get_databases_to_backup 
 +    dump_databases
  
-Il faut créer un second script pour faire le ménage régulièrement dans le dossier de backup pour éviter son embonpoint inévitable.+    # 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 
 +}
  
-On nomme ce fichier clean_backups.sh et son contenu est :+main
  
-<code>#!/bin/bash 
-# 
-## Supprime les sauvegardes vieilles de plus de 5 jours 
-# 
-find /root/scripts/backups/ -type f -mtime +4 -delete 
 </code> </code>
- 
- 
-Note : si votre mot de passe ou votre utilisateur contient les caractères : "!@#$%^" vous recevrez l'erreur 1045 "Access denied for user 'xxx'@'localhost "  
- 
-pour cela (à part changer de user/pass) il faut modifier la ligne : 
- 
-<code>mysqldump -uroot -pmonpass $i > ${i}_`date +"%Y-%m-%d"`.sql</code> 
- 
-par 
- 
-<code>mysqldump --user=xxx --password=xxx $i > ${i}_`date +"%Y-%m-%d"`.sql</code> 
  
  
  
 ===== 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
  
  
Ligne 89: Ligne 97:
 ===== Programmation de l'exécution des scripts avec Cron ===== ===== Programmation de l'exécution des scripts avec Cron =====
  
-<note tip>Si votre ordinateur n'est pas allumé en permanence, il vaut mieux utiliser [[http://doc.ubuntu-fr.org/fcron|fcron]], car cron ne s'exécute qu'à une heure précise de la journée alors que fcron prend en compte le temps pendant lequel reste allumé la machine</note>+FIXME Consulter la page [[:cron]] où il est préconisé d'utiliser <code bash>crontab -e</codepour 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
Ligne 95: Ligne 104:
 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_backups.sh 02-clean_backups 
  
-<note>Bien sûrsi vous avez déjà des scripts numérotés, incrémentez les numéros en fonction de ceux-ci...</note>+ 
 +<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 111: Ligne 122:
 ---- ----
  
- //Contributeurs : [[:utilisateurs:_Enchained]]//+ //Contributeurs : [[:utilisateurs:_Enchained]], [[:utilisateurs:_bruno]]//