Un code source PHP pour sauvegarder votre base de donnée MySQL

Voici un code source fonctionnel pour sauvegarder l’intégralité de votre base de donnée Mysql.


<?php
################################################################################
# L'auteur a autorisé la redistribution gratuite et l'inclusion de ce code dans
# les programmes à condition que cette notice de copyright soit dûment incluse.
# BackySQL (c)  2010 Brice Sanchez
# 10/03/2010 Brice SANCHEZ - www.brice-sanchez.com
#
# LE CODE COUVERT PAR CETTE LICENCE EST FOURNI « EN L'ÉTAT »,
# SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, INCLUANT,
# SANS S'Y LIMITER, LES GARANTIES D'ABSENCE DE DÉFAUT, DE QUALITÉ MARCHANDE,
# D'ADÉQUATION À UN USAGE PARTICULIER OU DE NON-VIOLATION DE DROITS DE TIERCES
# PARTIES. VOUS ASSUMEZ TOUS LES RISQUES LIÉS À LA QUALITÉ ET AUX PERFORMANCES
# DU CODE COUVERT PAR CETTE LICENCE. SI UN DÉFAUT, QUEL QU'IL SOIT, EST DÉTECTÉ
# DANS LE CODE COUVERT PAR CETTE LICENCE, VOUS (ET NON LE DÉVELOPPEUR INITIAL
# OU UN CONTRIBUTEUR) ASSUMEZ LE COÛT DES SERVICES D'ASSISTANCE, DES RÉPARATIONS
# OU DES CORRECTIONS NÉCESSAIRES. CETTE LIMITATION DE GARANTIE CONSTITUE UNE
# PARTIE ESSENTIELLE DE CETTE LICENCE. LE CODE COUVERT PAR CETTE LICENCE NE PEUT
# ÊTRE UTILISÉ QUE DANS LE CADRE DE CETTE LIMITATION DE GARANTIE.
# Vous utilisez ce code à vos propres risques.
################################################################################
////////////////////////////////////////////////////////////////////////////////
// @Description
//  Sauvegarde de base de donnée
// @Version				0.6
// @Licence				GNU/GPL3
//  http://www.gnu.org/licenses/gpl-3.0.html
// @Publication				Vendredi 12 Mars 2010
// @Revision				Samedi 13 Mars 2010
// @Catgorie				Administration
// @Compatibilite			PHP 4 >= 4.0.1, PHP 5
// @Auteur				Brice Sanchez
//  http://www.brice-sanchez.com/
// @Contributeur			Flashx
// @Contact
// @Télechargement
//  http://www.siteduzero.com/forum-83-498153-p1-sauvegarde-automatique-de-la-base-de-donnee-mysql.html#r4753068
// @Note
//  Utiliser un cron job toute les 24 h vers 3heure du matin
//
// @changement
//  Support la sauvegarde de DB differente
//  Windows compatibility
//  check config
//
// Remerciement
//  * à M@teo pour héberger gracieusement nos sources,
//  * à Brice pour l'élan communautaire qu'il a su ranimer,
//  * aux développeurs de siteduzero.com pour leurs conseils( notamment Sebi57)
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Configuration
////////////////////////////////////////////////////////////////////////////////
//TODO : céer un object de configuration( ajouter un nom a cette config, donner plus d'option)
// inclure la configuration : pas de C/C

// Nom de la base de donnée à enregistrer
$nom_bdd = 'test' ;

// Hôte de la base de donnée ciblé
$hote = 'localhost' ;

// Port de la base de donnée
$port = '3306' ;

// Nom d'utilisateur de la base de donnée à enregistrer
$utilisateur = 'root' ;

// Mot de passe de la base de donnée à enregistrer
$mot2passe = '' ;

// Exemple : latin1 ou utf8
$encodage_caracteres_mysql = 'latin1' ;

// Remplir le tableau si on veut sauvegarder uniquement certaines tables
// Exemple : array('table1','table2','table5')
$selection_tables_mysql = array();

// Chemin absolu de l'emplacement du site
$chemin_absolu_site = dirname( __FILE__) . DIRECTORY_SEPARATOR;

// Emplacement sur le FTP du répertoire des sauvegardes
$repertoire = 'sauvegarde_mysql';

// Nom du fichier ( ex : nomdelabasededonnee_2010-03-01_01-01-01.sql)
$ext_fichier = 'sql' ;

// Nombre de sauvegardes à garder sur le FTP
$nbre_sauvegardes_a_garder = 7 ;

define( "CHECK", true);
define( "FIRST_RUN", true);

////////////////////////////////////////////////////////////////////////////////
// Initialisation
////////////////////////////////////////////////////////////////////////////////
$repertoire_sauvegardes = $chemin_absolu_site . $repertoire.DIRECTORY_SEPARATOR;

$nom_fichier = $nom_bdd.'_'.date('Y-m-d_H-i-s').'.'.$ext_fichier ;

////////////////////////////////////////////////////////////////////////////////
// Vérification de l'environnement
////////////////////////////////////////////////////////////////////////////////
if( true == CHECK)
{
$sapi_type = php_sapi_name();// Context d'execution

if (substr($sapi_type, 0, 3) != 'cli') {
if( true == FIRST_RUN)
{
?><html><body>
<p>Il semblerai que vous souhaitez utiliser ce fichier a travers le reseaux.<br/>
<p>Si tel est votre souhais, Pensez à :
<ul>
<li>Autentifier l'attaquant;</li>
<li>Identifier l'attaquant;</li>
<li>Modifier périodiquement vos codes d'acces.</li>
</ul></p>
</body></html><?php
}
exit( );
}
if( is_dir ($repertoire_sauvegardes) === FALSE ) {
if(mkdir ($repertoire_sauvegardes, 0700) === FALSE ) {
exit('Impossible de créer le répertoire de sauvegarde'.PHP_EOL);
// TODO : Indiquer une solution
}
} else if( is_writable( $repertoire_sauvegardes)===FALSE) {
exit('Impossible d\'écrire dans le répertoire de sauvegarde'.PHP_EOL);
// TODO : Indiquer une solution
}

// tester la connexion Mysql;
// Que ce passe t-il si MySQL n'est pas en TCP mais en socket file ?
// Optimiser le mode de compatibilité mysql( interoger mysql)
// Que ce pass t'il si on se plante dans le nom des table $selection_tables_mysql( interoger mysql)
}

////////////////////////////////////////////////////////////////////////////////
// Sauvegarde de la base de donnée
////////////////////////////////////////////////////////////////////////////////

$commande  = 'mysqldump';
$commande .= ' --host='.$hote;
$commande .= ' --port='.$port;
$commande .= ' --user='.$utilisateur;
$commande .= ' --password='.$mot2passe ;
$commande .= ' --skip-opt';
$commande .= ' --compress';
$commande .= ' --add-locks';
$commande .= ' --create-options';
$commande .= ' --disable-keys';
$commande .= ' --quote-names';
$commande .= ' --quick';
$commande .= ' --extended-insert';
$commande .= ' --complete-insert';
$commande .= ' --default-character-set='.$encodage_caracteres_mysql;
$commande .= ' --compatible=mysql40';
$commande .= ' --result-file='.$repertoire_sauvegardes.$nom_fichier ;
$commande .= ' '.$nom_bdd ;

if( !empty($selection_tables_mysql) ) {
$commande .= ' '.implode(' ',$selection_tables_mysql) ;
}

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// a REVOIR, exec() serrai plus mieux ????????????????
// Execution de la commande de sauvegarde
system($commande) ;

// Compression au format GZIP du fichier sauvegardé
system('cd '.$repertoire_sauvegardes.'; gzip '.$nom_fichier) ;
// $] gzip: test_2010-03-13_02-31-16.sql.gz already exists; do you wish to overwrite (y or n)?
// et il me crée *.sql sans le gziper
// donc verifier les erreur retourner par systeme
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//TODO choix de la destination de la sauvegarde sur FTP

// Initialisation des variables
$tableau_sauvegardes = array();

// Ouverture du dossier, Attention au cache du filesysteme???
if ($repertoire_ouvert = opendir($repertoire_sauvegardes)) {
// Lecture des entrées
while( ($fichier_en_cours = readdir($repertoire_ouvert)) !== false) {
if(is_file($repertoire_sauvegardes.$fichier_en_cours)) {
if( substr( $fichier_en_cours, 0, strlen( $nom_bdd))!=$nom_bdd ) {
continue;//
}
// Mise en tableau des résultats
$tableau_sauvegardes[] = $fichier_en_cours;
}
}
// fermeture du dossier
closedir($repertoire_ouvert) ;
}

sort($tableau_sauvegardes, SORT_STRING);

// Supprime les fichiers en trop
$ln = sizeof( $tableau_sauvegardes)-( $nbre_sauvegardes_a_garder-1);
for($i=0; $i<$ln; $i++) {
unlink($repertoire_sauvegardes.$tableau_sauvegardes[$i]);
}

////////////////////////////////////////////////////////////////////////////////
// Loger nos actions
////////////////////////////////////////////////////////////////////////////////
//TODO, envoyer un mail : c'est rassurant

Grand maître L

Laisser un commentaire

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