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