SAUVEGARDE AUTOMATISÉE DE VOS BASES DE DONNÉES

Signaler
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
-
Messages postés
1
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
25 novembre 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45266-sauvegarde-automatisee-de-vos-bases-de-donnees

Messages postés
1
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
25 novembre 2010

Salut, je reçois le zip vide, et même sur le serveur ftp le zip est vide, quelqu'un aurait une idée ?
Messages postés
2
Date d'inscription
vendredi 29 janvier 2010
Statut
Membre
Dernière intervention
9 février 2010

Bonjour, je fais suite à mon post précédent : J'ai résolu le pb en renseignant les chemins complets dans le script
par exemple :

// test d'écriture (ne devrait en principe pas échouer)
if (!$handle = fopen('/media/portail/_Backups/sql/'.$filename, 'w'))

Car en fouinant sur le net j'ai vu qu'il est préférable de faire ça quand on lance un script par cron... Ca peut peut-être servir à quelqu'un... En tout cas pour moi ça a fonctionné (et ça fonctionne toujours d'ailleurs ;-) ).

Autre question : Est-ce que quelqu'un a testé une restauration d'une base sauvegardée par ce script? Avec quelle méthode?
Moi j'ai essayé un import via phpmyadmin, et ça plante : Ca crée bien la bdd et c'est tout. Le message d'erreur indique qu'aucune base n'est sélectionnée. J'ai donc rajouter une ligne dans la partie "en-tête du fichier d'export pour la base en cours" tel que suis :

// en-tête du fichier d'export pour la base en cours
$sql_header = '###############################################'."\n";
$sql_header .= '## BASE DE '.($row->Database)."\n";
$sql_header .= '###############################################'."\n\n";
$sql_header .= $s->{'Create Database'}.";\n\n";
$sql_header .= 'USE '.$row->Database.";\n\n";

J'ai donc rajouté la dernière ligne afin de faire une sélection de base lors de la restauration. J'ai testé ensuite et ça fonctionne avec phpmyadmin... (Toujours au cas où quelqu'un rencontre ce même pb).

Voili voilou. Si quelqu'un a des commentaires, des conseils, ou une autre solution, je suis preneur.

Bonne continuation!
$teph
Messages postés
2
Date d'inscription
vendredi 29 janvier 2010
Statut
Membre
Dernière intervention
9 février 2010

Salut, et avant toutes choses : Un grand bravo pour ton précieux code!

Je précise d'entrée que je suis novice en PHP et en linux (ce qui a son importance pour la suite).
J'ai donc adapté ton code à mes besoins : Nickel
Quand j'appel le fichier php via un browser : Nickel
Quand j'execute le fichier ./monfichier.php que j'ai d'abord rendu executable : Nickel
Quand je veux le lancer à partir du crontab : il plante à l'étape de vérification de la disponibilité en écriture de /sql (je reçois donc un mail avec l'erreur indiquée).
Quand je regarde le mail reçu du cron (j'ai masqué quelques infos par des ##):
=======================================================================
Date: Fri, 29 Jan 2010 14:44:01 +0100
Message-Id: <201001291344.o0TDi18g001560@######.#######.####>
From: root@######.#######.#### (Cron Daemon)
To: root@######.#######.####
Subject: Cron <root@######> php /media/portail/_Backups/backupMYSQL.php
Content-Type: text/plain; charset=UTF-8
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env:
X-Cron-Env: <LOGNAME=root>

Impossible d'ouvrir un ficher en écriture dans le répertoire "sql/"
Fin de la sauvegarde....
======================================================================
j'ai pourtant bien passé le dossier sql/ en chmod 1777 (avec le stickybit donc)
Je suis sous ubuntu 8.04 server. J'ai testé avec le crontab de l'utilisateur, et même du root et même pb.
J'ai créé un petit script qui ne fait que créer un repertoire test dans le dossier sql/ > Exactement pareil (ok via browser ou en ./test.php mais pas via crontab)

Voici quelques précisions :
---contenu du test.php :

#!/usr/bin/php
<?php
mkdir ("media/portail/_Backups/sql/test", 0777);
?>

---lancement du crontab :
$ sudo crontab -e

---ligne ajoutée au crontab (lancement toutes les minutes pour le test) :
*/1 * * * * php /media/portail/_Backups/backupMYSQL.php

Voila, où j'en suis, et là... Je bloque complétement... J'ai l'impression d'avoir tout essayé. C'est comme si le crontab n'avait pas le droit de créer des dossiers...
Est-ce que quelqu'un a une idée svp?
Merci d'avance

$teph
Messages postés
7
Date d'inscription
mardi 17 juin 2008
Statut
Membre
Dernière intervention
16 octobre 2009

Salut,

J'essaye en vain de faire marcher ta source chez OVH, j'ai du peut être louper quelques choses, car je mets le dossier / fichier en 777 (pour faire des essais), j'ai bien configurer les 3 petites lignes en bas de la source, puis quand je lance, bim Erreur 500 (d'entrée de jeux, donc c'est pas du à un time-out...

Aurais tu une idée de se qu'il faudrait que je modifie pour eviter cette erreur ?

A bientôt ^^
Messages postés
4
Date d'inscription
lundi 9 avril 2007
Statut
Membre
Dernière intervention
22 mars 2009

J'ai demandé sur le site du zero, mais il m'ont dis de voir ici.
Messages postés
38
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
17 février 2009

Bonjour, j'ai exactement le même problème que Simon59150.

Quand il y a une erreur, je reçois un mail,
quand tout est 'bon', je ne reçois pas de mail..

Auriez- vous une idée ?
merci d'avance
Messages postés
11
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
8 février 2009

Tres bonne source, fonctionne très bien 10/10
Messages postés
4
Date d'inscription
lundi 9 avril 2007
Statut
Membre
Dernière intervention
22 mars 2009

Salut, je reçoit le mail que si il y a un problème (erreur).

je ne reçois pas le mail quand ça marche, pourquoi ?
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut,

Oui, je n'y ai pas retouché depuis
Messages postés
1
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
29 septembre 2008

Bonjour,
merci pour ce super script !
Est-ce que la version présentée est la plus à jour ?
@+ David
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
essaie déjà de régler "mysql_fetch_object(): supplied argument is not a valid MySQL result resource". A vue de nez, t'as peut-être pas les droits suffisants pour lire toutes les bases?! Faut un peu analyser! Regarde ce qui se passe autour de la ligne 55...
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011

Hello, retour sur mon dernier poste.
j'ai tj les erreurs suivantes :

Warning: mysql_list_dbs() [function.mysql-list-dbs]: Unable to save MySQL query result in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 50
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 55
Warning: chdir() [function.chdir]: No such file or directory (errno 2) in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 153
Warning: fread() [function.fread]: Length parameter must be greater than 0. in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 209

La différence est le dernier message et oui je n'avais pas spésifier le chemin absolu du FTP mais relatif donc ca marchait pas.
Autre chose j'ai bien le mail avec le fichier zip en PJ mais winzip me dit que le fichier est endomagé. C'est pas étonnant vue que le pois est de 71 Octets au lieux des 76 K)
De plus l'archive ne se trouve pas dans mon rep /sql/ elle est ... nulpart.

Une idée ?!
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011

hello, je suis de retour et je n'arrive tj pas a faire marcher cette source :(
voici les erreurs que j'ais :

Warning: mysql_list_dbs() [function.mysql-list-dbs]: Unable to save MySQL query result in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 50

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 55

Warning: chdir() [function.chdir]: No such file or directory (errno 2) in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 153

Warning: ftp_put() [function.ftp-put]: Could not create file. in /home.10.2/zzzxzzz/www/xxxxx/sql/saveDB.php on line 182

mais que faire ??
et que l'on ne me dise pas que c'est un pb FTP car ce sont les code quie j'utilie pour mettre me fichier en ligne.

Merci de votre aide
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

OK je vais le faire lol....
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
T'aurais pu mettre ça dans le forum... :-/
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

Moi j'ai toujours cette erreur quand je veux restaurer les tables. Mais comme j'ai modifié un peu le script il y a peut être une erreur qqpart....

// DUMP SQL
function saveDB($mysql_array = array()){

$mysql_host = $mysql_array[0];
$mysql_user = $mysql_array[1];
$mysql_password = $mysql_array[2];

error_reporting(0);
$err_msg = '';
$maxinsert = 500;

if (!empty($mail_array)){
$mail = $mail_array[0];
$attachement = $mail_array[1];
}

if(!$link = mysql_connect($mysql_host,$mysql_user,$mysql_password))
$err_msg .= 'Impossible de se connecter à '.$mysql_host."\n";
else{
$testfile = 'backup_sql/'.uniqid(mt_rand()).'.tmp';
if (!$handle = fopen($testfile,'w'))
$err_msg .= 'Impossible d\'ouvrir un fichier en écriture dans le répertoire "backup_sql/"'."\n";
else
fclose($handle);

if (file_exists($testfile)) unlink($testfile);

if ($err_msg == ''){
$db_list = mysql_list_dbs($link);
$names = array();

while ($row = mysql_fetch_object($db_list)) {
if ($row->Database != 'information_schema'){
$q = 'SHOW CREATE DATABASE `'.($row->Database).'`';
$r = mysql_query($q);

while ($s=mysql_fetch_object($r)){
$filename = 'BackupSQL_'.($row->Database).'_'.date('d-m-Y').'.sql';
$names[] = $filename;
if (!$handle = fopen('backup_sql/'.$filename, 'w'))
$err_msg .= 'Impossible d\'ouvrir en écriture le fichier sql de '.($row->Database)."\n";
else{

$sql_header .= '# SQL Dump par script PHP'."\n";
$sql_header .= '# http://www.******.com'."\n";
$sql_header .= '#'."\n";
$sql_header .= '# Serveur: sql.*****.fr'."\n";
$sql_header .= '# Généré le '.date('d-m-Y à H:i:s').''."\n";
$sql_header .= '# Version du serveur PHP: '.phpversion().''."\n";
$sql_header .= '# Version de Mysql: '.mysql_get_server_info().''."\n";
$sql_header .= '#'."\n";
$sql_header .= '# Base de données: `'.($row->Database).'`'."\n";
$sql_header .= '#'."\n";
$sql_header .= '#'."\n\n";
$sql_header .= $s->{'Create Database'}.";\n\n";

if (fwrite($handle, $sql_header) === FALSE)
$err_msg .= 'Impossible d\'écrire dans le fichier sql de '.($row->Database)."\n";
else{
mysql_select_db($row->Database, $link);

$q3 = 'SHOW TABLES';
$r3 = mysql_query($q3);

while ($s3 = mysql_fetch_object($r3)){
$table = $s3->{'Tables_in_'.($row->Database)};
$q4 = 'SHOW CREATE TABLE `'.$table.'`;';
$r4 = mysql_query($q4);

while ($s4 = mysql_fetch_object($r4)){
$sql_export = '';
$sql_export .= '# ---------------------------------------------------'."\n\n";
$sql_export .= '#'."\n";
$sql_export .= '# Structure de la table `'.$table.'`'."\n";
$sql_export .= '#'."\n\n";
$sql_export .= $s4->{'Create Table'}."\n\n";

$q5 = 'SELECT * FROM `'.$table.'`;';
$r5 = mysql_query($q5);

$slashes = array();
$nbfields = mysql_num_fields($r5);
for($i=0; $i < $nbfields; $i++)
if (in_array(mysql_field_type($r5, $i), array('string','blob')))
$slashes[$i] = '\'';

$count = 0;

while($s5 = mysql_fetch_array($r5)){
$count++;

$sql_export .= '#'."\n";
$sql_export .= '# Contenu de la table `'.$table.'`'."\n";
$sql_export .= '#'."\n\n";

$sql_export .= 'INSERT INTO `'.$table.'` VALUES(';
$sql_export .= $slashes[0].mysql_real_escape_string($s5[0]).$slashes[0];
for($i=1; $i < $nbfields; $i++)
$sql_export .= ', '.$slashes[$i].mysql_real_escape_string($s5[$i]).$slashes[$i];

$sql_export .= ");\n";

if($count == $maxinsert){
if (fwrite($handle, $sql_export) === FALSE){
$err_msg .= 'Erreur d\'exportation avec la '.$table.' de la base '.($row->Database)."\n";

}
else
$sql_export = '';
}
}
$sql_export .= "\n";


if (fwrite($handle, $sql_export) === FALSE)
$err_msg .= 'Erreur d\'exportation avec la '.$table.' de la base '.($row->Database)."\n";
}
}
}
fclose($handle);
}
}
}
}
}
}
}

$mysql_data = array(SERVEUR,NAME,PASS);
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Warning: fopen(sql/106750348478fbbea7e075.tmp) [function.fopen]: failed to open stream: No such file or directory in /home.10.2/xxxxx/www/tst/sql/saveDB.php on line 40

=> le script s'attend à trouver un répertoire sql/ dans sql/
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

Tu as un problème avec ta connexion à ton FTP. Il faut que tu revois tes paramètres.
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011

Bonjour,
j'ai du remplacer error_log(0); par error_reporting(E_ALL); pour avoir les erreurs car je n'arrive pas a faire fonctionner le script.


Warning: fopen(sql/106750348478fbbea7e075.tmp) [function.fopen]: failed to open stream: No such file or directory in /home.10.2/xxxxx/www/tst/sql/saveDB.php on line 40
Notice: Undefined variable: archs in /home.10.2/xxxxx/www/tst/sql/saveDB.php on line 206
Notice: Undefined variable: archs in /home.10.2/xxxxxx/www/tst/sql/saveDB.php on line 239
Notice: Undefined variable: source_file in /home.10.2/xxxxx/www/tst/sql/saveDB.php on line 261
Warning: unlink() [function.unlink]: No such file or directory in /home.10.2/xxxxx/www/tst/sql/saveDB.php on line 261

Merci de votre aide
Messages postés
170
Date d'inscription
jeudi 21 octobre 2004
Statut
Membre
Dernière intervention
9 janvier 2008

Fabuleux Malik,

Je vais placer ce super code sur tous mes sites !

Merci !
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

Super, je vais regarder ça d'un peu plus prêt.

Merci pour le code ... et les réponses ! ;)
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Pas sûr, mais pour ce que je viens de voir sur gg, il semblerait qu'il est conseillé d'avoir

error_reporting(E_ALL);
error_log(...);
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

OK

Ca fait 6 ans que je code en ASP et je suis passé à PHP il y a peu. Donc question de débutant PHP :
error_reporting(0) désactive les rapports d'erreur dans le navigateur mais les bloque-t'il aussi dans les fichiers de logs du serveur ?
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Ben en 2 mots: si tu as une erreur et qu'elle s'affiche dans le navigateur, c'est des infos sur ton système que tu donnes à qui veut et qui peuvent servir pour de mauvaises intentions suivant quoi.

En principe, un site en production ne devrait jamais avoir d'erreurs qui s'affichent directement dans le browser.
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

outch ... là je suis largué ! error_reporting(0) pour une protection du script ? Tu peux m'en dire plus ?
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
OK, ceci dit, si j'ai enlevé le rapport d'erreur, c'est dans un souci de protection du script si qqun trouve le login/pwd pour accéder au répertoire. Anyway...
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

Bon tant mieux !

Pour les notices ... je n'aime pas travailler en error_reporting(0). Je préfère coder avec l'affichage des erreurs et corriger tout ce qui est nécessaire.

Ca me permet de garder des rapports d'erreurs sur d'autres problèmes plus ponctuels que je ne pouvais pas prévoir lors du codage par exemple.
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut,

C'est même plus propre ce que tu as mis! moi j'ai eu la flême :-)

Ceci dit, c'est étonnant que tu aies eu une notice car j'ai mis error_reporting(0)!
Messages postés
39
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
25 mai 2009

Merci pour ce code. J'ai peu en faire quelques adaptations pour mon usage personnel et ça fonctionne super bien.
J'ai juste un soucis de Notices qui est dû aux lignes 110-111 :

if (in_array(mysql_field_type($r5, $i), array('string','blob','date','timestamp')))
$slashes[$i] = '\'';

Est-ce que ça peut poser problème au niveau de la sauvegarde SQL de remplacer par ceci :

if (in_array(mysql_field_type($r5, $i), array('string','blob','date','timestamp'))){
$slashes[$i] = '\'';
} else {
$slashes[$i] = '';
}

Avec cette modif, plus d'erreur PHP de rapportée ... et donc des lignes en moins dans les logs ...
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
et 100!
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Là, je n'ai pas le temps de tester, mais je suis quasi sûr que le problème vient de la ligne 78.

Remplace
$sql_header .= $s->{'Create Database'}."\n\n";

par
$sql_header .= $s->{'Create Database'}.";\n\n"; // <- il y a un ";" en plus
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Je ne vois pas d'erreur... Essaie en console de faire "SHOW CREATE TABLE `referer`" et compare le résultat de l'export.
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

#1064 - Erreur de syntaxe pr?s de 'CREATE TABLE `referer` (
`id` smallint(4) NOT NULL auto_inc' ? la ligne 21

En plus le backup ne fonctionne pas ?
Tu as une idée ?
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

# SQL Dump par script PHP
# http://www.monsite.com
#
# Serveur: sql.******.fr
# Généré le 05-01-2008 à 20:45:14
# Version du serveur PHP: 4.3.11
# Version de Mysql: 4.1.16-Max
#
# Base de données: `base`
#
#

CREATE DATABASE `base` /*!40100 DEFAULT CHARACTER SET latin1 */

# ---------------------------------------------------

#
# Structure de la table `referer`
#

CREATE TABLE `referer` (
`id` smallint(4) NOT NULL auto_increment,
`nom` varchar(100) NOT NULL default '',
`ville` varchar(100) NOT NULL default '',
`date` date NOT NULL default '0000-00-00',
`photo1` varchar(255) NOT NULL default '',
`text1` varchar(60) NOT NULL default '',
`photo2` varchar(255) NOT NULL default '',
`text2` varchar(60) NOT NULL default '',
`photo3` varchar(255) NOT NULL default '',
`text3` varchar(60) NOT NULL default '',
`photo4` varchar(255) NOT NULL default '',
`text4` varchar(60) NOT NULL default '',
`photo5` varchar(255) NOT NULL default '',
`text5` varchar(60) NOT NULL default '',
`photo6` varchar(255) NOT NULL default '',
`text6` varchar(60) NOT NULL default '',
`description` text NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

Eh bien chez moi il ne sauvegarde pas AUTO_INCREMENT
donc sinon dans quelle ligne du code fait il cette sauvegarde ?
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut LiTtLeBuBu,

Content que ça te serve :-)

Je ne comprends pas ton problème d'auto-increment. Je viens de vérifier un export et je l'ai bien (il vaut 22 dans l'exemple suivant):

CREATE TABLE `demo_cat` (
`id` int(10) unsigned NOT NULL auto_increment,
`creation_date` date default NULL,
`name` text NOT NULL,
`internal_name` text NOT NULL,
`rang` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=22 DEFAULT CHARSET=latin1
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

Pour moi celà fonctionne très bien et c'est même la première source qui a réellement fonctionné pour dumper ma petite base.

Il faudrait juste pouvoir sauvegarder la valeur de AUTO INCREMENT.
Si tu as le bout de code à rajouter ce serait cool.

@+
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut Yoman64,

Merci pour tes remarques, je vais m'y pencher.

Ceci dit, quelqu'un qui a une base de données avec un million d'entrées a son propre serveur ou a en tous cas un accès ssh, cela me semble évident, et utilisera un code tout a fait différent (je dirais même un script .sh qui s'exécutera en quelques instants et fera tout ce que fais ce code ci-dessus! - expérience faite, 1.6GB zippés en moins d'une seconde en console, alors qu'avec un script PHP ce serait impossible).

Quoi qu'il en soit, pour le côté ludique de la chose, je vais réfléchir à tes remarques.

Merci,
Malik
Messages postés
592
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008

Salut,
Le code est loin d'être optimisé autant du coté php que mysql. Par exemple tu crée une requete INSERT par enregistrement, t'imagine si la table a un million d'enregistrements lors de la restauration ça fait 1 million de query.. ? Tu devrais mettre plusieurs enregistrements par insert, par exemple 500 pour chaque INSERT.

Je pense que mysql_real_escape_string est plus approprié que addslashes.

Pour vérifier si tu as accès en écriture à un fichier utilise la fonction is_writable au lieu de créé un fichier et de l'effacer ensuite.

Dans le coin ou il y a (dans ta boucle for):
# if($i != 0) $sql_export .= ', ';
# if(mysql_field_type($r5, $i) == 'stri
.......

Tu devrais sortir le if $i, une comparaison à chaque colone de chaque ligne c'est lourd pour rien.

Ensuite tes deux comparaisons pour savoir si tu dois mettre une quote ou pas tu devrais encore une fois le faire juste une fois et stocké la colonne et son type dans un array, après suffit d'appeler un array au lieu d'appeler 4 fonctions plus deux comparaisons a chaque colonne de chaque ligne :|.

Je ne note pas tout de suite, mais bravo l'envois par mail et par ftp est une bonne idée, par contre faut garder dans l'idée que ce script la avec les deux envois peut être très long si en plus tu fais 7-8 comparaisons inutiles par cycle (ex: tu as 12 lignes de 8 colonnes * 8 comparaisons= 768 comparaisons qui peuvent être évités).

Bonne continuation!
Messages postés
72
Date d'inscription
mercredi 29 mai 2013
Statut
Membre
Dernière intervention
15 mai 2009

Pour la rem 2 , il s'agit de traiter un dysfonctionnement risquant d'apparaître lors d'un transfert important, car les Ing Syst pour gérer les machines utilisent des règles de quotas: cpu, mémoire, io.... et comme au niveau d'un simple compte il n'y a pas d'engagement de niveaux de service de la part de l' hébergeur (c'est du best effort), la stratégie de sécurité de l'IS risque de pénaliser les perfs des comptes gourmands. Je pense que $sql_export (variable volatile) devrait se vider au fil de l'eau.
Cdt
JAN
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut Jantosze,

"Structurer ton test d'échec fopen du $handle avant les 3 boucles while d'extraction de la base ": effectivement, cela permettrait d'éviter de tout dumper pour rien en cas d'échec! Bonne remarque.

"Ne serait-il pas judicieux de vider la variable $sql_export (par exemple en fin du while $s5)": remarque également intéressante. Si je comprends bien ton point de vue, il s'agirait de stocker une table dans $sql_export, de l'écrire dans le fichier, puis de vider $sql_export avant de s'attaquer à la prochaine table?

Je vais m'y repencher...
Messages postés
72
Date d'inscription
mercredi 29 mai 2013
Statut
Membre
Dernière intervention
15 mai 2009

Salut,

L'objectif de ton code est de manipuler des volumes importants de données j'ai 2 remarques:
- Structurer ton test d'échec fopen du $handle avant les 3 boucles while d'extraction de la base ,
- Ne serait-il pas judicieux de vider la variable $sql_export (par exemple en fin du while $s5) pour éviter en cas de volume important un overflow de la limite mémoire accorder par l'administrateur du serveur.

cdt
JAN.
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
4
Oui c'est limité mais c'est une autre façon de dumper ^^
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
et si je peux encore ajouter quelque chose: ma source ne se borne pas à faire un mysqldump (--all-databases est d'ailleur une mauvaise idée :-)). Elle dump séparément les bases, crée un zip avec autant de fichiers à l'intérieur qu'il y a de bases, envoit le tout par ftp dans un répertoire protégé sur un autre serveur et envoit un email pour dire que tout s'est bien passé (ou non) avec le zip en fichier joint si demandé... le tout avec un petit appel en cron.

Ta commande shell est donc un chouilla réductrice ;-)
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
13
Salut Webdeb,

Merci pour ta remarque, ceci dit tout le monde n'a pas accès à un shell. J'ai plusieurs sites chez le principal hébergeur suisse (Infomaniak pour ne pas le citer) et il ne donne pas cette possibilité.
Messages postés
488
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
4
Salut,

J'aurais fait beaucoup plus simple :

<?php

shell_exec('mysqldump -h monServeurSql -u monUser -p monPassword --all-databases > chemin/mon/backup.sql');

?>

++