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 :
Donc ça plante sur cette instruction
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; } } }
$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.
Partager