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

Un film à venir « INCEPTION »

Je copie /colle le résumé :

Synopsis Officiel : Dom Cobb (Leonardo DiCaprio) est un redoutable voleur de rêves, le meilleur dans cet art dangereux qu’est l’extraction et qui consiste à dérober des secrets en plongeant directement dans l’inconscient du sujet pendant la phase du rêve, au moment où son esprit est le plus vulnérable. Les compétences hors pair de Cobb en ont fait une valeur très demandée dans le monde traître de l’espionnage industriel, mais aussi un fugitif à l’échelle internationale, en plus de lui avoir coûté tout ce qu’il aimait.
A présent, Cobb se voit offrir une chance de rédemption. Une dernière mission qui pourrait lui rendre la vie qui lui a été enlevée, à condition qu’il parvienne à réaliser l’impossible insertion. En effet, au lieu de devoir voler, Cobb et l’équipe de spécialistes qu’il dirige devront faire l’inverse, c’est-à-dire planter une idée dans l’esprit de quelqu’un. S’ils réussissent, le crime sera parfait. Mais rien ne peut préparer l’équipe à un dangereux ennemi capable de prédire tous leurs mouvements. Un ennemi que seul Cobb aurait pu voir venir.
Cet été, votre esprit est la scène du crime.

Grand Maitre L