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 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]