
#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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 #!/bin/bash
<?php
class BackupSql{
private $database_host = 'localhost';
private $database_user = 'root';
private $database_password = 'password';
private $database_name = 'databaseName';
private $database_encoding = 'utf8';
public function execute(){
/* initialisation de la date (avec le timezone au cas ou) */
date_default_timezone_set('Europe/Paris');
$date = date('Y-m-d-H-i');
$message = '';
$response = false;
/* nom du fichier .sql à générer */
$file = 'backup_'.$this->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();
É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 :
1 php BackupSql.php
Si tout se passe bien et qu’un fichier est généré, passez à l’étape crontab :
1 crontab -e
Ajouter à la fin votre nouvelle commande (Par exemple ci-dessous, je choisi de lancer le script tous les jours à 2h30) :
1 30 2 * * * /usr/bin/php /path/to/directory/BackupSql.php
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # 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'`
L’extension de ce fichier sera .sh, pour lancer cette commande via cron, rendez votre script exécutable :
1 chmod a+x backupSql.sh
Dans crontab -e, lancez votre commande simplement comme ceci :
1 30 2 * * * /path/to/directory/BackupSql.sh
Continuez sur le site...
Restez informés des Actus, Tutos et Bons-Plans en suivant BXNXG :
Tags