SAUVEGARDE AUTOMATISÉE DE VOS BASES DE DONNÉES

webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 - 3 janv. 2008 à 01:47
cs_panganino Messages postés 1 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 25 novembre 2010 - 25 nov. 2010 à 14:59
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

cs_panganino Messages postés 1 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 25 novembre 2010
25 nov. 2010 à 14:59
Salut, je reçois le zip vide, et même sur le serveur ftp le zip est vide, quelqu'un aurait une idée ?
srosco Messages postés 2 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 9 février 2010
9 févr. 2010 à 12:07
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
srosco Messages postés 2 Date d'inscription vendredi 29 janvier 2010 Statut Membre Dernière intervention 9 février 2010
29 janv. 2010 à 14:58
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
julkien60 Messages postés 7 Date d'inscription mardi 17 juin 2008 Statut Membre Dernière intervention 16 octobre 2009
16 oct. 2009 à 19:29
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 ^^
cs_simon59150 Messages postés 4 Date d'inscription lundi 9 avril 2007 Statut Membre Dernière intervention 22 mars 2009
22 mars 2009 à 12:33
J'ai demandé sur le site du zero, mais il m'ont dis de voir ici.
xstyled Messages postés 38 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 17 février 2009
18 mars 2009 à 11:09
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
thomas59553 Messages postés 11 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 8 février 2009
8 févr. 2009 à 18:34
Tres bonne source, fonctionne très bien 10/10
cs_simon59150 Messages postés 4 Date d'inscription lundi 9 avril 2007 Statut Membre Dernière intervention 22 mars 2009
12 oct. 2008 à 13:08
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 ?
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
29 sept. 2008 à 11:06
Salut,

Oui, je n'y ai pas retouché depuis
cs_macdav Messages postés 1 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 29 septembre 2008
29 sept. 2008 à 11:05
Bonjour,
merci pour ce super script !
Est-ce que la version présentée est la plus à jour ?
@+ David
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
27 janv. 2008 à 12:07
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...
cs_christobal Messages postés 208 Date d'inscription jeudi 3 octobre 2002 Statut Membre Dernière intervention 31 mars 2011
26 janv. 2008 à 11:23
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 ?!
cs_christobal Messages postés 208 Date d'inscription jeudi 3 octobre 2002 Statut Membre Dernière intervention 31 mars 2011
25 janv. 2008 à 19:05
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
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
18 janv. 2008 à 10:30
OK je vais le faire lol....
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
18 janv. 2008 à 09:53
T'aurais pu mettre ça dans le forum... :-/
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
18 janv. 2008 à 09:50
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);
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
18 janv. 2008 à 07:24
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/
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
17 janv. 2008 à 21:42
Tu as un problème avec ta connexion à ton FTP. Il faut que tu revois tes paramètres.
cs_christobal Messages postés 208 Date d'inscription jeudi 3 octobre 2002 Statut Membre Dernière intervention 31 mars 2011
17 janv. 2008 à 21:38
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
cs_johann1 Messages postés 170 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 9 janvier 2008
9 janv. 2008 à 01:11
Fabuleux Malik,

Je vais placer ce super code sur tous mes sites !

Merci !
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
7 janv. 2008 à 12:03
Super, je vais regarder ça d'un peu plus prêt.

Merci pour le code ... et les réponses ! ;)
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
7 janv. 2008 à 11:59
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(...);
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
7 janv. 2008 à 11:51
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 ?
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
7 janv. 2008 à 11:45
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.
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
7 janv. 2008 à 11:42
outch ... là je suis largué ! error_reporting(0) pour une protection du script ? Tu peux m'en dire plus ?
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
7 janv. 2008 à 11:38
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...
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
7 janv. 2008 à 11:36
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.
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
7 janv. 2008 à 11:32
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)!
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
7 janv. 2008 à 11:29
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 ...
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
6 janv. 2008 à 19:30
et 100!
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
6 janv. 2008 à 19:26
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
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
6 janv. 2008 à 19:21
Je ne vois pas d'erreur... Essaie en console de faire "SHOW CREATE TABLE `referer`" et compare le résultat de l'export.
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
6 janv. 2008 à 13:50
#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 ?
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
5 janv. 2008 à 20:51
# 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
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
5 janv. 2008 à 17:05
Eh bien chez moi il ne sauvegarde pas AUTO_INCREMENT
donc sinon dans quelle ligne du code fait il cette sauvegarde ?
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
5 janv. 2008 à 14:26
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
LiTtLeBuBu Messages postés 50 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 10 février 2009
5 janv. 2008 à 12:21
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.

@+
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
4 janv. 2008 à 10:48
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
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
3 janv. 2008 à 22:42
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!
jantosze Messages postés 72 Date d'inscription mercredi 29 mai 2013 Statut Membre Dernière intervention 15 mai 2009
3 janv. 2008 à 16:42
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
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
3 janv. 2008 à 11:09
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...
jantosze Messages postés 72 Date d'inscription mercredi 29 mai 2013 Statut Membre Dernière intervention 15 mai 2009
3 janv. 2008 à 10:58
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.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
3 janv. 2008 à 09:13
Oui c'est limité mais c'est une autre façon de dumper ^^
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
3 janv. 2008 à 07:55
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 ;-)
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
3 janv. 2008 à 07:39
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é.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
3 janv. 2008 à 01:47
Salut,

J'aurais fait beaucoup plus simple :

<?php

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

?>

++
Rejoignez-nous