PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 03/09/2012 10:44:04

bobjo
Membre

Faire une restauration de base de données avec php

Bonjour,

Et oui après avoir avoir sauvé mes données il faut que je les restaure.
Je me suis dit que cela allé être comme pg_dump avec un autre exécutable.
Mais cela à l'air plus complexe...
L'autre exécutable c'est pg_restore. Il a l'air de fonctionner comme pg_dump. Une ligne de commande avec des options.
Donc j'ai repris ma fonction php pour créer ma backup (voir cette discussion sur comment faire une backuphttp://forums.postgresql.fr/viewtopic.php?id=2225) et je l'ai adapté avec pg_restore.
Voila mon script :

$backup = parent::getData('Backup',$idBackup);
$filename = $backup[0]['Backup']['alias'].'.backup';
$maConfig = new DATABASE_CONFIG();
//Database Backup
putenv('PGHOST='.$maConfig->default['host']);
putenv('PGPORT=5432');
putenv('PGDATABASE='.$maConfig->default['database']);
putenv('PGUSER='.$maConfig->default['login']);
putenv('PGPASSWORD='.$maConfig->default['password']);
			
$pg_dumpPath = 'C:\\Progra~1\\PostgreSQL\\9.1\\bin\\pg_restore.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)) {//Condition conservé de pg_dump je ne sais si elle toujours utile surement si elle controle le chemin de pg_restore
	printf('The path to the database dump utility specified is wrong! (%s)', $pg_dumpPath);
	exit;
}
			
$cmd = $exe . " -c";
$sqlPath = escapeShellCmd('C:\\wamp\\www\\DEVELOPPEMENT\\gestion_prix_0.1_beta\\app\\webroot\backups\\'.$filename);
$cmd .= ' < '.$sqlPath;
// Execute command and return the output to the screen
$mesSys = system($cmd,$retour);
if($retour){
	$message = 'Restauration backup échoué'.$cmd;
	$this->Session->setFlash($message, 'notif', array('type'=>'error'));
	$this->redirect('/backups/listeDump');
}else{
	$message = 'Restauration backup ok'.$cmd;
	$this->Session->setFlash($message, 'notif');
	$this->redirect('/backups/listeDump');
}

La valeur de la variable $cmd passé à la fonction system : C:^\Progra^~1^\PostgreSQL^\9.1^\bin^\pg_restore.exe -c < C:^\wamp^\www^\DEVELOPPEMENT^\gestion_prix_0.1_beta^\app^\webroot^\backups^\mon_fichier.backup

La variable $message est toujours égale à : "Restauration backup ok" comme si la restauration avait fonctionné.
En effet lors d'un débug j'ai pu voir toutes les requêtes envoyé et il semble que pg_restore fait son boulot. Mais dans mes tables j'ai les backups plus récentes que celle restauré... Donc j'en déduit que ça n'a pas fonctionné.

Si quelqu'un a une idée ou une solution.

Merci d'avance

Dernière modification par bobjo (03/09/2012 11:21:44)

Hors ligne

#2 03/09/2012 10:52:36

kenrio
Membre

Re : Faire une restauration de base de données avec php

le pg_dump est fait sous quel format ?

Hors ligne

#3 03/09/2012 10:56:29

bobjo
Membre

Re : Faire une restauration de base de données avec php

Le pg_dump est fait sous format custom car d'après ce que j'ai compris dans la doc pg_restore prend seulement custom ou tar.  J'ai fais de petite modif entre la fonction sur le forum avec pg_dump et celle que j'utilise je la remet :

$maConfig = new DATABASE_CONFIG();
//Database Backup
putenv('PGHOST='.$maConfig->default['host']);
putenv('PGPORT=5432');
putenv('PGDATABASE='.$maConfig->default['database']);
putenv('PGUSER='.$maConfig->default['login']);
putenv('PGPASSWORD='.$maConfig->default['password']);
		
$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;
}
		
// Build command for executing pg_dump.  '-i' means ignore version differences.
$filename = 'backup_'.date('Ymd_His').'.backup';
$cmd = $exe . " -i";
$cmd .= ' -F c';
$sqlPath = escapeShellCmd('C:\\wamp\\www\\DEVELOPPEMENT\\gestion_prix_0.1_beta\\app\\webroot\backups\\'.$filename);
$cmd .= ' > '.$sqlPath;
		
// Execute command and return the output to the screen
system($cmd,$retour);
		
if($retour){
	$message = 'Création fichier backup échoué';
			
        $this->Session->setFlash($message, 'notif', array('type'=>'error'));
	$this->redirect('/backups/listeDump');
}else{
	$message = 'Création fichier backup ok';
	$this->Session->setFlash($message, 'notif');
	$this->redirect('/backups/listeDump');
}

J'ai changé le format de la sauvegarde et supprimé --inserts.

Merci de me répondre.

Dernière modification par bobjo (03/09/2012 11:01:34)

Hors ligne

#4 03/09/2012 11:00:08

kenrio
Membre

Re : Faire une restauration de base de données avec php

oui, d'où ma question ^^

et les logs httpd ?

Dernière modification par kenrio (03/09/2012 11:00:27)

Hors ligne

#5 03/09/2012 11:27:02

bobjo
Membre

Re : Faire une restauration de base de données avec php

Je ne suis trop habitué à mettre le nez dans le serveur.
Je pense que vous me parlez du fichier apache_error.
Il y a bien des erreur mais sans rapport avec  la commande pg_restor.
Voici ce que j'ai :
[Mon Sep 03 11:20:16 2012] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/app, referer: http://localhost/DEVELOPPEMENT/gestion_prix_0.1_beta/index.php/backups/listeDump
[Mon Sep 03 11:20:20 2012] [error] [client 127.0.0.1] File does not exist: C:/wamp/www/app, referer: http://localhost/DEVELOPPEMENT/gestion_prix_0.1_beta/index.php/backups/listeDump

Je pense que c'est du à une mauvaise config sous le framwork cakephp ou un bout de code qui traine que j'ai oublié cette erreur apparaît tous le temps.

Hors ligne

#6 03/09/2012 12:19:23

rjuju
Administrateur

Re : Faire une restauration de base de données avec php

Y a-t-il des erreurs dans les fichiers log de postgres ? Si vous restaurez des données sur une base existante, il y a de fortes chances que la restauration échoue pour les clés primaires etc.

Vous pouvez essayer avec pg_restore -c pour supprimer les objets avant de les restaurer, ou de les restaurer sur une autre base.

En ligne

#7 03/09/2012 13:13:54

bobjo
Membre

Re : Faire une restauration de base de données avec php

Bonjour rjuju et encore une fois merci de me répondre.
Oui j'ai des erreur dans le fichier log de postgres mais je ne pense que cela soit liée car les heures ne correspondent pas et malgré des nouvelles tentatives de restaurations il n'y en a pas de nouvelles.
Les voici :
2012-09-03 09:14:55 CEST ERREUR:  la relation « changes_id_seq » n'existe pas au caractère 97
2012-09-03 09:14:55 CEST INSTRUCTION :  SELECT last_value, min_value, max_value, cache_value, is_cycled, increment_by, is_called
      FROM changes_id_seq
2012-09-03 09:15:03 CEST ERREUR:  la relation « changes_id_seq » n'existe pas au caractère 97
2012-09-03 09:15:03 CEST INSTRUCTION :  SELECT last_value, min_value, max_value, cache_value, is_cycled, increment_by, is_called
      FROM changes_id_seq


Pour l'option -c je l'utilise déjà. Cela semble fonctionner un debug de la fonction system m'affiche tout un tas de requêtes DROP.
En voici quelques unes :
ALTER TABLE ONLY public.modules DROP CONSTRAINT modules_pkey;
DROP SEQUENCE public.modules_id_seq;
DROP TABLE public.modules;
DROP EXTENSION adminpack;
DROP EXTENSION plpgsql;
DROP SCHEMA public;


Je vu en parcourant le fichier (bien que très peut lisible) qu'il créé la base de données. Donc j'ai suivi la doc et j'ai ajouté dropdb mais cela ne change rien... Bien que la fonction system me renvoi 1, comme si cela avait fonctionné.

Cordialement.

Hors ligne

#8 03/09/2012 13:42:59

bobjo
Membre

Re : Faire une restauration de base de données avec php

Bon alors dans le fichier log y a du nouveau.
Apparemment, j'ai un problème avec dropdb.
2012-09-03 13:29:33 CEST ERREUR:  la base de données « postgres » existe déjÃ

Ma commande dropdb :
dropdb postgres

Dernière modification par bobjo (03/09/2012 13:48:49)

Hors ligne

#9 03/09/2012 13:59:08

rjuju
Administrateur

Re : Faire une restauration de base de données avec php

Je vous conseillerai d'éviter d'utiliser la base de données postgres. Elle est utilisée comme "base de maintenance", et est donc utilisée par défaut pour la plupart des outils tels que dropdb, qui ne peut pas supprimer la base sur laquelle il se trouve. Pour supprimer la base postgres, il faudrait du coup lancer une commande psql, telle que :


psql -c "DROP DATABASE postgres;" template1

En ligne

#10 03/09/2012 14:04:35

bobjo
Membre

Re : Faire une restauration de base de données avec php

Désolé je fais beaucoup de petit message mais je fais beaucoup de teste donc je vous met les résultats.
Donc je me suis aperçu que si j’indiquai le chemin dans la commande de pg_dump et pg_restore  je devais le faire également pour dropdb.
Du coup voici ma commande pour dropdb :
C:^\Progra^~1^\PostgreSQL^\9.1^\bin^\dropdb.exe postgres

Cela a eu une conséquence dans le fichier logs. J'ai une nouvelle erreur :
2012-09-03 13:53:05 CEST ERREUR:  la base de données « postgres » est en cours d'utilisation par d'autres utilisateurs
2012-09-03 13:53:05 CEST DÉTAIL:  2 autres sessions utilisent la base de données.
2012-09-03 13:53:05 CEST INSTRUCTION :  DROP DATABASE postgres;

Une question avant de faire une bêtise, si je renseigne les variables d'environnement et que dans pg_restore je met comme option -C, postgres me créera-t-il ma base renseigné dans la variable d'environnement PGDATABASE ? Ou faut-il que j'utilise l'option -d pour lui indiqué la base ?

Hors ligne

#11 03/09/2012 15:04:06

bobjo
Membre

Re : Faire une restauration de base de données avec php

Bon j'ai changé de base de données mais ça change rien...
Le problème semble bien venir de la commande dropdb qui ne veux pas s’exécuter à cause d'autres sessions qui utilisent la base de données.

2012-09-03 14:56:52 CEST ERREUR:  la base de données « gestPrix » est en cours d'utilisation par d'autres utilisateurs
2012-09-03 14:56:52 CEST DÉTAIL:  1 autres sessions utilisent la base de données.
2012-09-03 14:56:52 CEST INSTRUCTION :  DROP DATABASE "gestPrix";

J'ai arrêté postgres puis redémarré. Avant j'avais 2 session en cours, maintenant j'en ai plus qu'une. Mais le problème reste le même...
Y a-t-il un moyen de supprimer les sessions ?

Hors ligne

#12 03/09/2012 16:27:23

bobjo
Membre

Re : Faire une restauration de base de données avec php

Alors ça avance pas...
J'ai arrêté ma machine, puis redémarré mais ça change rien. Toujours le même message d'erreur...

2012-09-03 16:10:14 CEST LOG:  le système de bases de données a été arrêté à 2012-09-03 16:08:46 CEST
2012-09-03 16:10:15 CEST LOG:  le système de bases de données est prêt pour accepter les connexions
2012-09-03 16:10:15 CEST LOG:  lancement du processus autovacuum
2012-09-03 16:15:08 CEST ERREUR:  la base de données « gestPrix » est en cours d'utilisation par d'autres utilisateurs
2012-09-03 16:15:08 CEST DÉTAIL:  1 autres sessions utilisent la base de données.
2012-09-03 16:15:08 CEST INSTRUCTION :  DROP DATABASE "gestPrix";

Quelque chose que je ne comprend pas c'est que postgres semble tourné tous le temps.
Je m'explique :
Après avoir redémarré mon ordi, j'ai lancé wamp je suis allé sur mon travail en cours et je me suis connecté. Et là j'ai réalisé que je n'avais pas lancé pgAdmin. Ou quoi que se soit en rapport avec postgres. Je comprend pas très bien comment cela est possible ???
Pour rappel je suis débutant sous postgres.
Enfin cela n'a surement rien à voir avec mon problème.

Cordialement.

Hors ligne

#13 03/09/2012 16:37:51

rjuju
Administrateur

Re : Faire une restauration de base de données avec php

Postgres est probablement installé comme service, et se relance donc tout seul quand votre ordinateur redémarre.

Si vous avez pgAdmin connecté sur votre base, il est normal d'avoir une connexion sur votre base. Vous pouvez utiliser la vue pg_stat_activity qui peut vous afficher toutes les connexions présentes sur votre serveur.

En ligne

#14 03/09/2012 16:55:11

bobjo
Membre

Re : Faire une restauration de base de données avec php

J'ai fait cette requête SELECT * FROM pg_stat_activity WHERE datname='gestPrix' dans pgAdmin avec l'outil "Executé vos propres requête SQL".
J'ai bien 2 lignes qui s'affiche. Dans le champ application_name j'ai :
1ere ligne : pgAdmin III - Navigateur
2eme ligne : pgAmin III - ??diteur de requ??tes (j'imagine que cela est : éditeur de requête).

Lorsque je coupe mon navigateur, le résultat est le même et lorsque j'enlève la condition WHERE j'ai 3 lignes
3eme ligne pgAdmin III - Navigateur (la différence c'est que celle ci indique une connexion sur la base postgres (base que je n'utiliise plus suite à votre conseille)).

Cordialement.

Hors ligne

#15 03/09/2012 17:09:15

rjuju
Administrateur

Re : Faire une restauration de base de données avec php

Si la base de donnée est indiquée comme connecté dans l'explorateur d'objet de pgAdmin, il y a forcément une connexion ouverte sur la base. Il faut déconnecter la base depuis l'explorateur si l'option est disponible, sinon fermer toutes les connexions et ne rouvrir que la base postgres par exemple.

En ligne

#16 04/09/2012 09:40:39

bobjo
Membre

Re : Faire une restauration de base de données avec php

Bonjour,
Bon je viens de faire la requête  :SELECT * FROM pg_stat_activity dans le système que je développe et un debug du résultat. Cela m'affiche un tableau (normal !) qui indique apparemment une seul connexion à ma base, je le copie si ça peux servir :

array(
	(int) 0 => '16877',
	(int) 1 => 'gestPrix',
	(int) 2 => '1700',
	(int) 3 => '10',
	(int) 4 => 'postgres',
	(int) 5 => '',
	(int) 6 => '127.0.0.1',
	(int) 7 => '',
	(int) 8 => '49688',
	(int) 9 => '2012-09-04 09:14:54.707+02',
	(int) 10 => null,
	(int) 11 => '2012-09-04 09:14:54.785+02',
	(int) 12 => 'f',
	(int) 13 => '<IDLE>'
)

Dans le fichier log j'ai toujours mon erreur :

2012-09-04 09:15:00 CEST ERREUR:  la base de données « gestPrix » est en cours d'utilisation par d'autres utilisateurs
2012-09-04 09:15:00 CEST DÉTAIL:  1 autres sessions utilisent la base de données.
2012-09-04 09:15:00 CEST INSTRUCTION :  DROP DATABASE "gestPrix";

Et là je comprend plus trop...
D'un côté il me dit que j'ai 1 connexion à ma base et de l'autre il me dit qu'une autre session utilise ma base ???
Il me semble que cela est lié au framework cakephp.

Cordialement

Hors ligne

#17 04/09/2012 09:53:54

bobjo
Membre

Re : Faire une restauration de base de données avec php

Je viens de modifier la façon dont je exécute la requête  SELECT * FROM pg_stat_activity en passant par les méthode de cakephp. Cela ne m'a pas renvoyé le même tableau :

 array(
	'datid' => (int) 16877,
	'datname' => 'gestPrix',
	'procpid' => (int) 940,
	'usesysid' => (int) 10,
	'usename' => 'postgres',
	'application_name' => '',
	'client_addr' => '127.0.0.1',
	'client_hostname' => '',
	'client_port' => (int) 50296,
	'backend_start' => '2012-09-04 09:49:19.828+02',
	'xact_start' => '2012-09-04 09:49:19.892+02',
	'query_start' => '2012-09-04 09:49:19.892+02',
	'waiting' => false,
	'current_query' => 'SELECT * FROM pg_stat_activity'
)

Mais ça ne change rien... J'ai toujours la même erreur dans le fichier log.

Hors ligne

#18 04/09/2012 10:14:04

rjuju
Administrateur

Re : Faire une restauration de base de données avec php

Peut-être que votre script php ouvre systématiquement une connexion à la base, et que cela fait du coup planter le dropdb ?

En ligne

#19 04/09/2012 10:24:50

bobjo
Membre

Re : Faire une restauration de base de données avec php

Bonjour rjuju,

Je viens de poster un message sur forum de cakePHP dans ce sens. Je vous tiens au courant.

Hors ligne

Pied de page des forums