Différences
Ci-dessous, les différences entre deux révisions de la page.
| 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 22/09/2008, 09:12] topazz |
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 sauvegarde sgbd}} | + | {{tag>tutoriel sauvegarde serveur sgbd mysql }} |
| ---- | ---- | ||
| + | |||
| + | ====== Sauvegarder automatiquement ses bases de données 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. | ||
| - | ====== Sauvegarder automatiquement ses bases de données (MySQL) avec cron ====== | + | <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> |
| - | + | ||
| - | 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. | + | |
| 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 14: | 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**. | ||
| - | 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érantes. 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'arreter 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]] | ||
| - | ===== Pré-requis ===== | + | ===== Création du script ===== |
| - | * 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]] | + | |
| + | 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> | ||
| + | Le script s'appellera backup_bdd.sh et contient : | ||
| + | <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() | ||
| - | ===== Création des scripts ===== | + | get_databases_to_backup() { |
| - | Nous allons créer nos scripts dans le répertoire **/root/scripts/**. Seul root y aura accès en lecture (et écriture).<br /> | + | mysql_command=$(command -v mysql) |
| - | Nous créons un premier script que l'on appelera backup_bdd.sh qui contient : | + | databases_list=$($mysql_command --defaults-file=/etc/mysql/debian.cnf -Bse 'show databases') |
| + | for exclude in $databases_exclude_list | ||
| + | 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 | ||
| - | <code>#!/bin/bash | + | echo "$(date +%c): Backup complete!" |
| - | # | + | } |
| - | ## on se place dans le repertoire ou l'on veut sauvegarder les bases | + | delete_old_backups() { |
| - | # | + | find_command=$(command -v find) |
| - | cd /root/scripts/backups/ | + | cd "${backup_folder}" || exit |
| + | $find_command ./ -mtime +"${delete_backups_older_than_days}" -type f -exec rm -v {} \; | ||
| + | } | ||
| - | for i in mon_site mon_forum mon_blog; do | + | 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 | ||
| - | ## Sauvegarde des bases de donnees en fichiers .sql | + | get_databases_to_backup |
| - | mysqldump -uroot -pmonpass $i > ${i}_`date +%D | sed 's;/;-;g'`.sql | + | dump_databases |
| - | ## Compression des exports en tar.bz2 (le meilleur taux de compression) | + | # nombre de jours pendant lesquels il faut conserver les sauvegardes, -1 si illimité |
| - | tar jcf ${i}_`date +%D | sed 's;/;-;g'`.sql.tar.bz2 ${i}_`date +%D | sed 's;/;-;g'`.sql | + | delete_backups_older_than_days=1 |
| + | if [ $delete_backups_older_than_days != "-1" ] ; then | ||
| + | delete_old_backups | ||
| + | fi | ||
| + | } | ||
| - | ## Suppression des exports non compresses | + | main |
| - | rm ${i}_`date +%D | sed 's;/;-;g'`.sql | + | |
| - | done | ||
| </code> | </code> | ||
| - | |||
| - | Mettez dans la ligne | ||
| - | |||
| - | <code>for i mon_site mon_forum mon_blog; do</code> | ||
| - | |||
| - | la liste de toutes les bases de données que vous voulez sauvegarder. | ||
| - | |||
| - | 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. | ||
| - | |||
| - | 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. | ||
| - | |||
| - | On nomme ce fichier clean_backups.sh et son contenu est : | ||
| - | |||
| - | <code>#!/bin/bash | ||
| - | # | ||
| - | ## Supprime les sauvegardes vieilles de plus de 5 jours | ||
| - | # | ||
| - | find /root/scripts/backups/ -type f -mtime +4 | xargs -r rm | ||
| - | </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 : | ||
| - | |||
| - | mysqldump -uroot -pmonpass $i > ${i}_`date +%D | sed 's;/;-;g'`.sql | ||
| - | |||
| - | par | ||
| - | |||
| - | mysqldump --user=xxx --password=xxx $i > ${i}_`date +%D | sed 's;/;-;g'`.sql | ||
| ===== 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 93: | 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</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 | ||
| Ligne 99: | 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ûr, si 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 lien, celui-ci ne serait pas exécuté et cron ne log pas cette non exécution. | ||
| + | </note> | ||
| C'est fini :) | C'est fini :) | ||
| Ligne 115: | Ligne 122: | ||
| ---- | ---- | ||
| - | //Contributeurs : [[:utilisateurs:_Enchained]]// | + | //Contributeurs : [[:utilisateurs:_Enchained]], [[:utilisateurs:_bruno]]// |