#miniTuto Créer une sauvegarde SQL de son site avec une tâche journalière #3
Par Benjamin le 9 février 2016 dans PersoPHPServeurTutorielsWeb
Facebook Tweeter Google+ Commentaires NewsletterBienvenue dans ce 3ème #miniTuto ou je vais vous montrer une petite class PHP qui va vous permettre de sauvegarder votre base de donnée. Ensuite, à l’aide d’une tâche cron vous pourrez l’appeler à interval régulier (1 fois par jours, toutes les 6h…). Les sauvegardes .sql seront stockées dans un dossier et se limiterons à un nombre définit, on supprimera les anciennes sauvegardes afin d’éviter de remplir inutilement le disque ;).
A la fin j’ai mis une version bash de ce script, très ressemblante puisque dans la version PHP j’utilise des commandes bash comme mysqldump.
Partie PHP
Créez le fichier BackupSql.php :
[cce_php]#!/bin/bash database_name.'_'.$date.'.sql'; /* le dossier de destination par rapport au dossier ou se trouve le script avec __DIR__ */ $destination = __DIR__.'/backup/database/'; /* vérification si le dossier de destination est présent, création sinon */ if (!file_exists($destination)) { @mkdir($destination); } /* si le fichier généré est déjà présent (doublon dans la même minute), on ne le regénère pas */ if(!file_exists($destination.$file)){ /* commande mysqldump qui va tout faire : se connecter, récupérer le contenu de la base de données et l'exporter vers le dossier de destination */ system('mysqldump --host='.$this->database_host.' --user='.$this->database_user.' --password='.$this->database_password.' --hex-blob --routines --skip-lock-tables --default-character-set='.$this->database_encoding.' '.$this->database_name.' > '.$destination.$file,$error); /* selon les configurations, vous pouvez aussi utiliser exec() à la place de system */ /* si $response ne renvoit pas false (= pas d'erreurs) */ if(!$error){ $message .= "Fichier ".$file." Générén"; /* nombre maximal de backup à garder */ $numberBackup = 64; $oldBackup = array(); /* ouverture du dossier destination */ if($dir = @opendir($destination)){ /* on liste tous les fichiers présents dans $oldBackup */ while(($file = readdir($dir)) !== false){ if(!preg_match('#^.#',$file)){ $oldBackup[] = $destination.$file; } } closedir($dir); /* si le nombre de fichiers présents $oldBackup dépasse $numberBackup, on retire les plus anciens */ if(count($oldBackup) > $numberBackup){ /* $n correspond au nombre d'élement à retirer */ $n = count($oldBackup) - $numberBackup; if($n){ sort($oldBackup); for($i=0;$i<$n;$i++){ /* suppression du fichier */ @unlink($oldBackup[$i]); } $message .= $n." ancien".($n > 1 ? "s":"")." fichier".($n > 1 ? "s":"")." supprimé".($n > 1 ? "s":"")."n"; } } } } }else{ $message .= "Le fichier existe déjàn"; } if($message){ print($message); }else{ print("Une erreur est survenue...n"); } } } /* lancement du script */ $b = new BackupSql(); $b->execute();[/cce_php]
Éditez les premières variables ($database_x …) et aussi le dossier de destination (ligne 19).
Pas besoin de plus d’information, tout est mis dans les commentaires ???? ! Puis passez à l’étape suivante sur votre console…
Partie Terminal
Ouvrez votre terminal (que se soit en local ou par SSH sur votre serveur), positionnez vous dans votre dossier et testez votre commande :
[cce_bash]php BackupSql.php[/cce_bash]
Si tout se passe bien et qu’un fichier est généré, passez à l’étape crontab :
[cce_bash]crontab -e[/cce_bash]
Ajouter à la fin votre nouvelle commande (Par exemple ci-dessous, je choisi de lancer le script tous les jours à 2h30) :
[cce_bash]30 2 * * * /usr/bin/php /path/to/directory/BackupSql.php[/cce_bash]
Et voilà ! Pensez donc à créer le répertoire pour le backup, mettez aussi des droits d’exécutions minimums.
C’est évident mais ne placez pas votre script PHP et vos backups à un emplacement accessible depuis une url (pas dans vos dossiers www/ par exemple ^^). A moins que vous souhaitez récupérer vos sauvegardes autrement que par ftp ou ssh, mettez un htaccess avec un htpasswd au minimum…
Ce tutoriel est terminé ????. Je vous mets ci-dessous une version 100% bash, qui tient en quelques lignes seulement et qui fera la même chose :
[cce_bash]# file backupSql.sh #!/bin/bash host='localhost' user='root' password='password' name='databaseName' encoding='utf8' # pensez à mettre le dossier depuis la racine de votre serveur destination = '/backup/database' date=$(date +"%d-%b-%Y") # droit d'écriture umask 177 # récupération de la base de données mysqldump --user=$user --password=$password --host=$host $name > $destination/backup_$name_$date.sql # suppression des fichiers les plus anciens, mais pas les 64 derniers rm `ls -t | awk 'NR>64'`[/cce_bash]
L’extension de ce fichier sera .sh, pour lancer cette commande via cron, rendez votre script exécutable :
[cce_bash]chmod a+x backupSql.sh[/cce_bash]
Dans crontab -e, lancez votre commande simplement comme ceci :
[cce_bash]30 2 * * * /path/to/directory/BackupSql.sh[/cce_bash]
Continuez sur le site...
Restez informés des Actus, Tutos et Bons-Plans en suivant BXNXG :
Tags