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 :

[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

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.