09 Fév 2016

#miniTuto Créer une sauvegarde SQL de son site avec une tâche journalière #3

Google+ Commentaires Newsletter

Bienvenue 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

Leave a Comment

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.