IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Script de sauvegarde de BDD : plantage max_execution_time [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Script de sauvegarde de BDD : plantage max_execution_time
    Bonjour à tous,

    Et bien tout est presque dans le titre. Je précise.
    J'ai écrit un petit script de sauvegarde de BDD qui lit les structures et les données des tables pour les écrire dans un fichier texte avec les DROP, CREATE et INSERT qui vont bien. Pour mon test, j'ai injecté 100 000 enregistrements dans une table, résultat, elle pèse 3 Mo.

    Et je plante en max_time (alors que j'ai poussé mon serveur à 180 sec au lieu de 30). Voici la boucle incriminée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    $tables = mysql_list_tables($base) or die(mysql_error());//on liste les tables
      while ($donnees = mysql_fetch_array($tables))
        {
        $table = $donnees[0];
        $res = mysql_query("SHOW CREATE TABLE $table") or die(mysql_error());
        if ($res)
          {
          $insertions = "";
    	  $drop = "";
    	  $drop .= "DROP TABLE IF EXISTS `$table`;\n";
    	  fputs($F,$drop);
          $tableau = mysql_fetch_array($res);
    	  ;
          $tableau[1] .= ";";
          $dumpsql[] = str_replace("\n", "", $tableau[1]);
          $req_table = mysql_query("SELECT * FROM $table");
          $nbr_champs = mysql_num_fields($req_table);
          while ($ligne = mysql_fetch_array($req_table))
            {
            $insertions .= "INSERT INTO $table VALUES(";
            for ($i=0; $i<=$nbr_champs-1; $i++)
              {
              $insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
              }
            $insertions = substr($insertions, 0, -2);//ICI CA PLANTE !!!
    	$insertions .= ");\n";
            }
          if ($insertions != "")
            {
            $dumpsql[] = $insertions;
            }
          }
       }
    Donc ça plante sur cette instruction
    $insertions = substr($insertions, 0, -2);
    qui est destinée à virer les dernières virgules en bout de chaines.
    J'ai testé avec une BDD de 800 Ko, ça passe comme une lettre à la poste.
    Pas avec 3 Mo.
    Est ce que quelqu'un aurait une idée quant à la façon d'optimiser cette requête pour qu'elle passe avec des grosses BDD ?
    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonjour,

    Ton script est assez propre, ca va être difficile de l'optimiser davantage.

    Pourquoi ne pas utiliser un outil d'export comme le propose PhpMyAdmin ?

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Je ne peux pas utiliser PhpMyadmin car c'est pour une application dans laquelle je propose aux membres de sauvegarder leur BDD depuis leur bureau virtuel.

    Mais je comprends pas trop pourquoi la fonction substr plante, je ne lui demande que de supprimer un caractère...
    C'est si gourmand que ça ?

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Mais je comprends pas trop pourquoi la fonction substr plante, je ne lui demande que de supprimer un caractère...
    C'est si gourmand que ça ?
    Je ne comprends pas, substr plante ou alors tu as excèdes le temps d'execution ?

    Si substr plante, quelle est l'erreur affichée (ou dans les logs) ?

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Je m'explique sans doute mal.
    Ce n'est pas substr qui plante, mais bel et bien max_execution_time, que j'ai pourtant passé à 180 secondes au lieu de 30.
    Je l'ai remis à 30, ce qui est à peu près le standard des params PHP.
    Et bien sûr, c'est pire.

    Je notre que si je vire cette instruction substr, les 3Mo de la sauvegarde s'écrivent en moins de 10 secondes. Bien sûr, le fichier sql généré n'est pas bon, puisque les INSERT ont cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO matable ('1','toto','tata','toto@free.fr','toto',);
    On voit que la virgule de fin va entraîner un plantage SQL si on veut réinsérer la base.
    Mais cette expérience prouve que c'est bien substr qui entraîne le max_execution_time...

    Alors je cherche un moyen moins gourmand pour nettoyer la fin de la chaîne.

  6. #6
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bon, ben j'ai finalement trouvé une soluce, à la place de substr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     while ($ligne = mysql_fetch_array($req_table))
      {
       $insertions .= "INSERT INTO $table VALUES(";
        for ($i=0; $i<=$nbr_champs-1; $i++)
         {
    	 if($i<$nbr_champs-1){
              $insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
    	  }else{
    	  $insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "'";
    	  }
         }
     $insertions .= ");\n";
     }
    Tant que le dernier champ n'est pas atteint, j'insère la virgule...
    Et sinon, non.
    Voili-voilou. Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Script de sauvegarde d'une BDD Mysql en local
    Par darkterreur dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 27/09/2012, 09h43
  2. [MySql] Sauvegarde / export bdd
    Par sebb84 dans le forum JDBC
    Réponses: 15
    Dernier message: 26/05/2008, 14h57
  3. [SQL] Probleme avec script de sauvegarde de BDD
    Par killbrice dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/06/2007, 00h48
  4. creation de script pour construire ma BDD sur un server
    Par Konrad Florczak dans le forum Outils
    Réponses: 2
    Dernier message: 04/08/2005, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo