[PHP/MySQL] - Produire un dump de quelques tables? - Un backup à la myadmin, mais plus simple

Voilà je me rends compte que mon application a un gros manque : de quoi sauver la bdd facilement et sans mon intervention (fin du stage).

Je voudrais donc faire un petit dump de mes structures de tables, et aussi des insertions contenues dans ces dernières !

Juste un rendu format html à copier / coller dans un fichier texte me suffit :slight_smile:

Merci par avance de votre aide :slight_smile:

<?php
/*
 *
 *
 * Avertissement : Cette librairie de fonctions PHP est distribuee avec l'espoir 
 * qu'elle sera utile, mais elle l'est SANS AUCUNE GARANTIE; sans meme la garantie de 
 * COMMERCIALISATION ou d'UTILITE POUR UN BUT QUELCONQUE.
 * Elle est librement redistribuable tant que la presente licence, ainsi que les credits des 
 * auteurs respectifs de chaque fonctions sont laisses ensembles. 
 * En aucun cas, Nexen.net ne pourra etre tenu responsable de quelques consequences que ce soit
 * de l'utilisation ou la mesutilisation de ces fonctions PHP.

*/

/****
 * Titre : Backup Base de données MySQL 
 * Auteur : Cedric Fronteau 
 * Email : charlie@nexen.net
 * Url : www.nexen.net
 * Description : Crée un fichier de backup d'une base de données avec les memes options que phpmyadmin (structure et/ou données), CSV ou SQL...
****/
function backupDatabase($link,$db_name,$structure,$donnees,$format,$insertComplet=""){
/* Parametres : 
    *    $link : lien vers la base de donnees
    *    $db_name : nom de la base de donnees
    *    $structure : true => sauvegarde de la structure des tables
    *    $donnees : true => sauvegarde des donnes des tables
    *    $format : format des donnees ('INSERT' => des clauses SQL INSERT,
    *                                  'CSV' => donnees separees par des virgules)
    *    $insertComplet (optionnel) : true => clause INSERT avec nom des champs
    */
   
   if (!is_resource($link))
      return false;
   mysql_select_db($db_name);
   
   $format = strtoupper($format);
   
   $filename = "backup_".$db_name."_".date("Y_m_d_H_i").".sql";
   $fp = fopen($filename,"w");
   if (!is_resource($fp))
      return false;
   
   // liste des tables
   $res = mysql_list_tables($db_name,$link);
   $num_rows = mysql_num_rows($res);
   $i = 0;
   while ($i < $num_rows)
      {
      $tablename = mysql_tablename($res, $i);
      if ($structure === true)
         {
         fwrite($fp,"DROP TABLE IF EXISTS `$tablename`;\n");
         // requete de creation de la table
         $query = "SHOW CREATE TABLE $tablename";
         $resCreate = mysql_query($query);
         $row = mysql_fetch_array($resCreate);
         $schema = $row[1].";";
         fwrite($fp,"$schema\n\n");
         }
      if ($donnees === true)
         {
         // les données de la table
         $query = "SELECT * FROM $tablename";
         $resData = mysql_query($query);
         if (mysql_num_rows($resData) > 0)
            {
            $sFieldnames = "";
            if ($insertComplet === true)
               {
               $num_fields = mysql_num_fields($resData);
               for($j=0; $j < $num_fields; $j++)
                  {
                  $sFieldnames .= "`".mysql_field_name($resData, $j)."`,";
                  }
                $sFieldnames = "(".substr($sFieldnames,0,-1).")";
               }
            $sInsert = "INSERT INTO `$tablename` $sFieldnames values ";
            
            while($rowdata = mysql_fetch_assoc($resData))
               {
               $lesDonnees = "<guillemet>".implode("<guillemet>,<guillemet>",$rowdata)."<guillemet>";
               $lesDonnees = str_replace("<guillemet>","'",addslashes($lesDonnees));
               
               if ($format == "INSERT")
                  {
                  $lesDonnees = "$sInsert($lesDonnees);";
                  }
               fwrite($fp,"$lesDonnees\n");
               }
            }
         }
      $i++;
      }   
   fclose($fp);
}

$link = mysql_connect('localhost','root','');

$query = mysql_query('SHOW DATABASES');

while($row = mysql_fetch_array($query)) {
	backupDatabase($link,$row['0'],true,true,'INSERT');
}
?>

Un petit script que j’ai modifié pour mon utilisation.

Pour une seule base il faut juste enlever le while.

MErci bien, je vais tester ca ^^

Hum quel while ? :smiley:

$link = mysql_connect('localhost','root','');

$query = mysql_query('SHOW DATABASES');

while($row = mysql_fetch_array($query)) {
backupDatabase($link,$row['0'],true,true,'INSERT');
}

:wink:

ok, en revanche comment je passe les paramètres ? et ils entendent quoi par link = liens vers la base de données ?

$link = mysql_connect(‘localhost’,‘root’,’’);

$query = mysql_query(‘SHOW DATABASES’);

while($row = mysql_fetch_array($query)) {
backupDatabase($link,$row[‘0’],true,true,‘INSERT’);
}

ok je viens de comprendre comment ca marchait :slight_smile: j’ai un peu du mal ce matin :slight_smile:

Merci bien du coup de main :wink:

EDIT: trouvé en fait :slight_smile:

Startide> mysqldump. Surtout si tu as accès au serveur.

Voilà…

Ben euh moi j’ai pas de soucis, c’est l’utilisateur qui est tout noob qui a besoin d’un truc simple :slight_smile:

Pour la réimportation j’ai pas trouvé de méthode simple ==> phpmyadmin ^^

mysql.

mysqldump.

Deux utilitaires situés dans le dossier bin de mysql et qui te permettent d’exporter/importer des bdds. A partir de là, tu peux créer un fichier bat qui fait tout tout seul…

Salut,

[b]J’ai une erreur sur l’ouverture du fichier :

Warning: fopen(backup_information_schema_2008_04_01_19_42.sql) [function.fopen]: failed to open stream: Permission denied in /home/www/2c2d8b9c67293ffc75861c57089a4109/web/site/admin/backup2.php on line 28

Warning: fopen(backup_zonegeekscom_2008_04_01_19_42.sql) [function.fopen]: failed to open stream: Permission denied in /home/www/2c2d8b9c67293ffc75861c57089a4109/web/site/admin/backup2.php on line 28[/b]

Comment faire pour donner les autorisations sur ces deux fichiers ?

Merci

Pour réimporter ton dump ?
Bah… mysql_query(file_get_contents(‘fichier_dump’)) :kaola: