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 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é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. |
- | * 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 : | + | <code> sudo 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 +%D | 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ûr, si 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 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 96: | Ligne 122: | ||
---- | ---- | ||
- | --- //Contributeurs : [[:utilisateurs:_Enchained]]// | + | //Contributeurs : [[:utilisateurs:_Enchained]], [[:utilisateurs:_bruno]]// |