cs_panganino
Messages postés1Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention25 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és2Date d'inscriptionvendredi 29 janvier 2010StatutMembreDerniè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és2Date d'inscriptionvendredi 29 janvier 2010StatutMembreDerniè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>
---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és7Date d'inscriptionmardi 17 juin 2008StatutMembreDernière intervention16 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és4Date d'inscriptionlundi 9 avril 2007StatutMembreDernière intervention22 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és38Date d'inscriptionjeudi 18 mai 2006StatutMembreDernière intervention17 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és11Date d'inscriptionlundi 23 décembre 2002StatutMembreDerniè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és4Date d'inscriptionlundi 9 avril 2007StatutMembreDernière intervention22 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 29 sept. 2008 à 11:06
Salut,
Oui, je n'y ai pas retouché depuis
cs_macdav
Messages postés1Date d'inscriptionlundi 26 juillet 2004StatutMembreDernière intervention29 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és208Date d'inscriptionjeudi 3 octobre 2002StatutMembreDernière intervention31 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és208Date d'inscriptionjeudi 3 octobre 2002StatutMembreDernière intervention31 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és50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 février 2009 18 janv. 2008 à 10:30
OK je vais le faire lol....
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 18 janv. 2008 à 09:53
T'aurais pu mettre ça dans le forum... :-/
LiTtLeBuBu
Messages postés50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 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()){
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);
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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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és208Date d'inscriptionjeudi 3 octobre 2002StatutMembreDernière intervention31 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és170Date d'inscriptionjeudi 21 octobre 2004StatutMembreDerniè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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és39Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention25 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 :
par
$sql_header .= $s->{'Create Database'}.";\n\n"; // <- il y a un ";" en plus
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 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és50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 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 */
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és50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és50Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention10 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDerniè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és72Date d'inscriptionmercredi 29 mai 2013StatutMembreDernière intervention15 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és72Date d'inscriptionmercredi 29 mai 2013StatutMembreDernière intervention15 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és488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 3 janv. 2008 à 09:13
Oui c'est limité mais c'est une autre façon de dumper ^^
malik7934
Messages postés1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és1154Date d'inscriptionmardi 9 septembre 2003StatutMembreDernière intervention15 août 200917 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és488Date d'inscriptionsamedi 5 avril 2003StatutMembreDernière intervention31 mars 20094 3 janv. 2008 à 01:47
25 nov. 2010 à 14:59
9 févr. 2010 à 12:07
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
29 janv. 2010 à 14:58
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
16 oct. 2009 à 19:29
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 ^^
22 mars 2009 à 12:33
18 mars 2009 à 11:09
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
8 févr. 2009 à 18:34
12 oct. 2008 à 13:08
je ne reçois pas le mail quand ça marche, pourquoi ?
29 sept. 2008 à 11:06
Oui, je n'y ai pas retouché depuis
29 sept. 2008 à 11:05
merci pour ce super script !
Est-ce que la version présentée est la plus à jour ?
@+ David
27 janv. 2008 à 12:07
26 janv. 2008 à 11:23
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 ?!
25 janv. 2008 à 19:05
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
18 janv. 2008 à 10:30
18 janv. 2008 à 09:53
18 janv. 2008 à 09:50
// 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);
18 janv. 2008 à 07:24
=> le script s'attend à trouver un répertoire sql/ dans sql/
17 janv. 2008 à 21:42
17 janv. 2008 à 21:38
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
9 janv. 2008 à 01:11
Je vais placer ce super code sur tous mes sites !
Merci !
7 janv. 2008 à 12:03
Merci pour le code ... et les réponses ! ;)
7 janv. 2008 à 11:59
error_reporting(E_ALL);
error_log(...);
7 janv. 2008 à 11:51
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 ?
7 janv. 2008 à 11:45
En principe, un site en production ne devrait jamais avoir d'erreurs qui s'affichent directement dans le browser.
7 janv. 2008 à 11:42
7 janv. 2008 à 11:38
7 janv. 2008 à 11:36
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.
7 janv. 2008 à 11:32
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)!
7 janv. 2008 à 11:29
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 ...
6 janv. 2008 à 19:30
6 janv. 2008 à 19:26
Remplace
$sql_header .= $s->{'Create Database'}."\n\n";
par
$sql_header .= $s->{'Create Database'}.";\n\n"; // <- il y a un ";" en plus
6 janv. 2008 à 19:21
6 janv. 2008 à 13:50
`id` smallint(4) NOT NULL auto_inc' ? la ligne 21
En plus le backup ne fonctionne pas ?
Tu as une idée ?
5 janv. 2008 à 20:51
# 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
5 janv. 2008 à 17:05
donc sinon dans quelle ligne du code fait il cette sauvegarde ?
5 janv. 2008 à 14:26
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
5 janv. 2008 à 12:21
Il faudrait juste pouvoir sauvegarder la valeur de AUTO INCREMENT.
Si tu as le bout de code à rajouter ce serait cool.
@+
4 janv. 2008 à 10:48
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
3 janv. 2008 à 22:42
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!
3 janv. 2008 à 16:42
Cdt
JAN
3 janv. 2008 à 11:09
"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...
3 janv. 2008 à 10:58
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.
3 janv. 2008 à 09:13
3 janv. 2008 à 07:55
Ta commande shell est donc un chouilla réductrice ;-)
3 janv. 2008 à 07:39
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é.
3 janv. 2008 à 01:47
J'aurais fait beaucoup plus simple :
<?php
shell_exec('mysqldump -h monServeurSql -u monUser -p monPassword --all-databases > chemin/mon/backup.sql');
?>
++