Vous n'êtes pas identifié(e).

#1 30/08/2012 15:00:28

bobjo
Membre

[RESOLU] Faire une sauvegarde avec pg_dump et php

Bonjour,

J'ai besoin de pouvoir faire des sauvegardes de ma base de données à partir de script php.
Après avoir parcouru le forum, la méthode la plus conseillé est pg_dump avec la fonction systeme de php.

J'ai donc testé plusieurs syntaxes mais aucunes ne fonctionnent.

Voila ou j'en suis :

function exportData(){
		chdir("C:\Program files\PostgreSQL\9.1\bin");
		$message = system('pg_dump postgres --host localhost --port 5432 -U postgres -f C:\wamp\www\DEVELOPPEMENT\gestion_prix_0.1_beta\app\webroot\backups\test.sql', $retour);
		$my_file = 'C:\wamp\www\DEVELOPPEMENT\gestion_prix_0.1_beta\app\webroot\backups\fichier_message.txt';
		$fp = fopen($my_file, "w");
		fwrite($fp, $message);
		if(!$retour){
			$this->Session->setFlash("Execution backup échouée.".debug($message), 'notif', array('type'=>'error'));
            $this->redirect('/backups/listeDump');
		}else{
			$this->Session->setFlash("Execution backup ok.".debug($message), 'notif');
            $this->redirect('/backups/listeDump');
		}
	}

J'ai testé avec les abréviations (exemple : --file et -f) j'ai ajouté le mot de passe et tout un tas d'autre essai. Mais rien n'y fait.
La variable $retour renvoi toujours 1 et $message, j'arrive pas à l'afficher ou à l'écrire dans un fichier.

Si quelqu'un à une solution !

Merci d'avance.

Dernière modification par bobjo (31/08/2012 15:29:07)

Hors ligne

#2 30/08/2012 15:46:49

bobjo
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Alors ça avance un peu sur un internet j'ai trouvé :

$message = system('pg_dump postgres --host localhost --port 5432 -U postgres > C:\wamp\www\DEVELOPPEMENT\gestion_prix_0.1_beta\app\webroot\backups\test.sql', $retour);

La différence est que je ne met plus l'option -f ou --file mais > à la place.
Cela crée bien le fichier au bon endroit mais le fichier est vide.

La personne qui poster sur le forum ou j'ai trouvé ce début de solution avait le même problème et pour solution à du modifier le fichier pg_hba.conf.
Il a passé la méthode de md5 à trust et cela lui a posé des problème avec l'ipv6. De plus cette méthode trust semble donner un accés total à n’importe qui (si j'ai bien comprise la doc) !

Le problème ne viendrait-il pas du fait que je sois connecté sur mon ordi avec un autre utilisateur que celui que postgres utilise ?

Hors ligne

#3 30/08/2012 16:52:46

rjuju
Administrateur

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Bonjour,

mettre l'authentification à trust dans le pg_hba permet de se connecter à postgresql sans mot de passe mais sous certaines conditions. Vous pouvez le restreindre à un utilisateur postgres et/ou une ou plusieurs adresse(s) ip. Dans votre cas, il s'agirait donc de n'autoriser que l'ip locale.


En cas de problème d'authentification, il est possible de rester en md5 et d'utiliser un fichier .pgpass contenant les informations de connexion voulue, mais il faut que ce fichier soit dans le répertoire  %APPDATA%\postgresql de l'utilisateur faisant tourner le service (voir http://docs.postgresqlfr.org/9.1/libpq-pgpass.html). Il faut donc le configurer selon votre configuration du service windows wamp.


Je vous conseillerai de d'abord passer la connexion locale en trust pour vérifier que vous pouvez bien sauvegarder votre base ou corriger plus facilement les problèmes existant, et ensuite de repasser en md5 si vous voulez une meilleure sécurité.

Hors ligne

#4 31/08/2012 09:59:45

bobjo
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Bonjour et merci rjuju de me répondre !

Malgré avoir passé la méthode en trust cela me crée toujours un fichier vide.
J'ai essayé ma commande dans la console et cela ma renvoyé :
Commande \wamp invalide. Essayez \? pour l'aide-mémoire.
Mon problème pourrait-il venir du chemin que je lui indique ? Pourtant j'ai testé avec la fonction php escapeshellarg mais cela n'a rien changé.

Dans mon script, j'utilise la fonction system qui devrait stocker la valeur retourné dans une variable $message. Mais cette variable semble inexistante ou très particulière à lire. Mais elle semble également très intéressante. Auriez vous un moyen d'y accédé ?

Encore une fois merci de votre intérêt pour mon problème.

Hors ligne

#5 31/08/2012 10:52:03

rjuju
Administrateur

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Je crois que php sous windows a des problèmes avec l'échappement des arguments.

Vous pouvez essayer de remplacer les \ par des / pour le fichier de destination.

Hors ligne

#6 31/08/2012 11:41:01

bobjo
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Je viens d'essayé en remplaçant les \ par des / mais cela fait la même chose... Même en utilisant en la fonction escapeshellarg.

Je remet mon script :(je traville sous le framwork cakephp)

chdir("C:\Program files\PostgreSQL\9.1\bin");
$message = system('pg_dump postgres -h localhost -U postgres > C:/wamp/www/DEVELOPPEMENT/gestion_prix_0.1_beta/app/webroot/backups/test.sql', $retour);
$my_file = 'C:/wamp/www/DEVELOPPEMENT/gestion_prix_0.1_beta/app/webroot/backups/fichier_message.txt';
$fp = fopen($my_file, "r+");
fputs($fp, $message);
fclose($fp);
if(!$retour){
    $this->Session->setFlash("Execution backup échouée.", 'notif', array('type'=>'error'));
    $this->redirect('/backups/listeDump');
}else{
    $this->Session->setFlash("Execution backup ok.", 'notif');
    $this->redirect('/backups/listeDump');
}

Ce qui est étrange c'est que le 2em paramètre de system renvoi toujours 1 et me dit que la backup est ok ???

Hors ligne

#7 31/08/2012 13:59:02

bobjo
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Salut je continu à parcourir internet et j'ai trouvé un script tiré de phpPgAdmin.

putenv('PGHOST=localhost');
putenv('PGPORT=5432');
putenv('PGDATABASE=postgres');
putenv('PGUSER=postgres');
putenv('PGPASSWORD=***************');
$pg_dumpPath = 'C:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_dump.exe';
$exe = escapeShellCmd($pg_dumpPath);
		 
// Obtain the pg_dump version number and check if the path is good
$version = array();
preg_match("/(\d+(?:\.\d+)?)(?:\.\d+)?.*$/", exec($exe . " --version"), $version);
		 
if (empty($version)) {
	printf('The path to the database dump utility specified is wrong! (%s)', $pg_dumpPath);
	exit;
}
		 
$ctype="application/force-download";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
$filename = 'backup_'.date('Y.m.d').'.sql';
$header="Content-Disposition: attachment; filename=".$filename.";";
header($header);
header("Content-Transfer-Encoding: binary");
		 
// Build command for executing pg_dump.  '-i' means ignore version differences.
$cmd = $exe . " -i";
$cmd .= ' --inserts';
// Execute command and return the output to the screen
passthru($cmd);

J'étais allé voir leur code aussi mais n'avais pas pu l'adapté pour mon cas.

Enfin, ce code me renvoi l'erreur contenu dans la condition du contrôle de version et de chemin :
The path to the database dump utility specified is wrong! (C:\Program Files\PostgreSQL\9.1\bin\pg_dump.exe)
Hors le fichier pg_dump.exe se trouve bien à cet endroit ???

Franchement je comprend plus...

Cordialement

Hors ligne

#8 31/08/2012 14:56:34

rjuju
Administrateur

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

Quelle est votre version de windows ? Depuis vista ou 7, je crois que le nom du répertoire affiché dans l'explorateur ne correspond plus au "vrai" répertoire tel qu'on doit l'utiliser en ligne de commande.

Hors ligne

#9 31/08/2012 15:28:44

bobjo
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

C'EST BON !!!!!!!!!!!!!!!!!!

Je met le code :

//Database Backup
putenv('PGHOST=localhost');
putenv('PGPORT=5432');
putenv('PGDATABASE=postgres');
putenv('PGUSER=postgres');
putenv('PGPASSWORD=*********');
$pg_dumpPath = 'C:\\Progra~1\\PostgreSQL\\9.1\\bin\\pg_dump.exe';
$exe = escapeShellCmd($pg_dumpPath);
		 
// Obtain the pg_dump version number and check if the path is good
$version = array();
preg_match("/(\d+(?:\.\d+)?)(?:\.\d+)?.*$/", exec($exe . " --version"), $version);
		 
if (empty($version)) {
	printf('The path to the database dump utility specified is wrong! (%s)', $pg_dumpPath);
	exit;
}

$filename = 'backup_'.date('Y.m.d').'.sql';
		 
// Build command for executing pg_dump.  '-i' means ignore version differences.
$cmd = $exe . " -i";
$cmd .= ' --inserts';
$sqlPath = escapeShellCmd('C:\\wamp\\www\\DEVELOPPEMENT\\gestion_prix_0.1_beta\\app\\webroot\backups\\'.$filename);
$cmd .= ' > '.$sqlPath;
passthru($cmd);

En effet cela venait du nom du répertoire Program Files qui en français est nommé Programme et qui pour les commandes doit avoir cette écriture Progra~1 (plus d'explication ici http://en.wikipedia.org/wiki/Program_Files).

Merci encor pour votre aide rjuju.

Hors ligne

#10 03/09/2012 10:47:59

kenrio
Membre

Re : [RESOLU] Faire une sauvegarde avec pg_dump et php

oups mauvais topic

Dernière modification par kenrio (03/09/2012 10:48:18)

Hors ligne

Pied de page des forums