IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Restauration de schémas sans perdre les autres schémas


Sujet :

PostgreSQL

  1. #1
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut Restauration de schémas sans perdre les autres schémas
    Bonjour,

    J'ai un logiciel qui fonctionne avec PostgreSQL. J'ai besoin pour certain traitement de copier la base de donnée et de la restaurer sur un autre serveur. Je me trompe peu être mais il me semble qu'il n'est pas possible de faire des requettes sur différentes bases de données sur un même serveur. j'ai donc réalisé un schéma spécifique dans la base qui m'intéresse avec les éléments que je désire ajouter.

    Comment faire pour restaurer la base de donnée sans perdre le schéma que j'ai créé?

    Je pose la question car jusqu’à maintenant, je supprimais la base de donnée avant de la recréer (vierge = template0) puis la restaurais

    Cordialement,
    Vandman

  2. #2
    Membre confirmé

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Par défaut
    Bonjour,

    Je ne comprends pas entièrement le problème , mais par défaut PostgreSQL est configuré pour qu'un utilisateur utilise d'abord le schéma qui porte son nom, s'il existe (ensuite il va dans le schéma par défaut).

    ce comportement peut être changé pour la session courante avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SET search_path TO schema1,schema2, etc...;
    Vous pouvez aussi spécifier cette commande pour l’utilisateur pour conserver le réglage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ALTER USER myuser SET search_path TO schema1,schema2, etc...;
    Si la restauration est effectuée depuis l'user configuré il devrait d'abord essayer de restaurer dans schéma1, sinon dans schema2 et plus dans "public".

    Alternativement vous pouvez créer un utilisateur ayant le même nom que le schéma qui effectue les tâches de backup et de restauration.


    Vouus pourriez aussi utiliser l'option "--exclude-table" de pg_dump, qui me paraît plus portable et plus facile à intégrer dans un script. D’autres techniques sont possibles mais je les connais moins bien (réplication, et depuis la version 9.3 les requêtes cross-server sont possibles via postgres_fdw: http://postgresql.developpez.com/doc...tgres-fdw.html)

  3. #3
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    J'ai fait comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #!/bin/sh
     
    #Demande de toutes les informaions dont nous avons besoin
    echo -n "Entrez le nom d'utilisateur PostgreSQL [postgres] : "
    read UserPG
    #Vérification qu'un utilisateur à bien été renseigné pour la connection à PostgreSQL.
    case $UserPG in
    	"") UserPG="postgres"
    	    echo "Bienvenu $UserPG\n";;
     
    	* ) echo "Bienvenu $UserPG\n";;
    esac
     
    echo -n "Mot de passe : "
    read  PGpassword
    #Vérification qu'un mot de passe à bien été renseigné pour la connection à PostgreSQL.
    case $PGpassword in
    	"") echo "Pas de mot de passe PostgreSQL définit\n"
    	    exit 1;; #exit shell script
    	*) echo "Votre mot de passe à bien été pris en compte\n";;
    esac
     
    echo -n "Ip ou non du serveur PostgreSQL  [localhost] ?"
    read PGhostname
    #Vérification qu'une IP ou un nom machine à bien été renseignée pour la connection à PostgreSQL.
    case $PGhostname in
    	"") PGhostname="localhost"
    	   echo "L'hôte ou l'IP PostgreSQL est $PGhostname\n";;
    	*) echo "L'hôte ou l'IP PostgreSQL est $PGhostname\n";;
    esac
     
    echo -n "Port du serveur PostgreSQL [5432] ? "
    read port_num
    #Vérification qu'un port à bien été renseigné pour la connection à PostgreSQL.
    case $port_num in
    	"") port_num="5432"
    	    echo "Le port par défaut ($port_num) sera utilisé\n";;
     
    	*) echo "Le port suivant ($port_num) sera utilisé\n";;
    esac
     
    #Récupération du répertoir courant
    date_dump=`ls -d /home/user/application/Dump/* | tail -1 | cut -d '/' -f5`
    echo $date_dump
    echo -n "Nom de la base de donnée pour Appli? \n [1. PROD] \n [2. QUALIF] \n [3. FORMATION] \n [4. Toutes les plateformes]"
    read appli_db
    #Vérification qu'une base de donnée à bien été renseignée pour travailler dessus.
    case $appli_db in
    	"" ) 	echo "Pas de base de donnée PostgreSQL définit\n"
    	     	exit 1;; #exit shell script
    	1|PROD|prod|Prod|production|Production|PRODUCTION)
    		CaseDB='1'
    		appli_db="prod_app"
    		echo "La base de donnée PostgreSQL est $appli_db\n"
    		dump_location=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp;;
    	2|QUALIF|qualif|Qualif|QUALIFICATION|qualification|QUALIFICATION)
    		CaseDB='2'
    		appli_db="qualif_app"
    		echo "La base de donnée PostgreSQL est $appli_db\n"
    		dump_location=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp;;
    	3|FORMATION|formation|Formation|FORM|form|Form)
    		CaseDB='3'
    		appli_db"form_app"
    		echo "La base de donnée PostgreSQL est $appli_db\n"
    		dump_location=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp;;
    	4|tous|toutes|"toutes les bases"|"Toutes les bases")
    		CaseDB='4'
    		appli_db1="prod_app"
    		dump_location1=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp
    		appli_db2="qualif_app"
    		dump_location2=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp
    		appli_db3="form_app"
    		dump_location3=/home/user/application/Dump/$date_dump/dump_application_Eapp_"$date_dump"_000501.dmp;;
    esac
     
    if [ $CaseDB = 1 ] || [ $CaseDB = 2 ] || [ $CaseDB = 3 ] ; then
    		#Création du fichier permettant de s'identifier au serveur PostgreSQL.
    		touch $HOME/.pgpass
    		#Attribution des droits sur le fichier, pas d'autre choix que 0600, si non, ca ne fonctionne pas.
    		chmod 0600 $HOME/.pgpass
    		#Remplissage du fichier avec les bons parametres
    		echo "$PGhostname:$port_num:$appli_db:$UserPG:$PGpassword" > $HOME/.pgpass
    		#
    		psql -h $PGhostname -p $port_num $appli_db -U $UserPG << EOF
    		DROP SCHEMA IF EXISTS application CASCADE;
    EOF
    # Attention, EOF ne doit pas avaoir d'espace avant. si non, cela génèrera une erreur.
    		sleep 3
    		cat $dump_location | psql  -h $PGhostname -p $port_num $appli_db -U $UserPG
    		#Efface le mot de passe dans la variable et le fichier.
    		PGpassword=""
    		rm $HOME/.pgpass
    else
    		#Création du fichier permettant de s'identifier au serveur PostgreSQL.
    		touch $HOME/.pgpass
    		#Attribution des droits sur le fichier, pas d'autre choix que 0600, si non, ca ne fonctionne pas.
    		chmod 0600 $HOME/.pgpass
    		#Remplissage du fichier avec les bons parametres
    		echo "$PGhostname:$port_num:$appli_db1:$UserPG:$PGpassword" > $HOME/.pgpass
    		#
    		psql -h $PGhostname -p $port_num $appli_db1 -U $UserPG << EOF
    		DROP SCHEMA IF EXISTS application CASCADE;
    EOF
    		sleep 3
    		cat $dump_location1 | psql  -h $PGhostname -p $port_num $appli_db1 -U $UserPG
     
    		#Efface le mot de passe dans la variable et le fichier.
    		rm $HOME/.pgpass
    		#Création du fichier permettant de s'identifier au serveur PostgreSQL.
    		touch $HOME/.pgpass
    		#Attribution des droits sur le fichier, pas d'autre choix que 0600, si non, ca ne fonctionne pas.
    		chmod 0600 $HOME/.pgpass
    		#Remplissage du fichier avec les bons parametres
    		echo "$PGhostname:$port_num:$appli_db2:$UserPG:$PGpassword" > $HOME/.pgpass
    		#
    		psql -h $PGhostname -p $port_num $appli_db2 -U $UserPG << EOF
    		DROP SCHEMA IF EXISTS application CASCADE;
    EOF
    		sleep 3
    		cat $dump_location2 | psql  -h $PGhostname -p $port_num $appli_db2 -U $UserPG
    		#Efface le mot de passe dans la variable et le fichier.
    		rm $HOME/.pgpass
    		#Création du fichier permettant de s'identifier au serveur PostgreSQL.
    		touch $HOME/.pgpass
    		#Attribution des droits sur le fichier, pas d'autre choix que 0600, si non, ca ne fonctionne pas.
    		chmod 0600 $HOME/.pgpass
    		#Remplissage du fichier avec les bons parametres
    		echo "$PGhostname:$port_num:$appli_db3:$UserPG:$PGpassword" > $HOME/.pgpass
    		#
    		psql -h $PGhostname -p $port_num $appli_db3 -U $UserPG << EOF
    		DROP SCHEMA IF EXISTS application CASCADE;
    EOF
    		sleep 3
    		cat $dump_location3 | psql  -h $PGhostname -p $port_num $appli_db3 -U $UserPG
    		#Efface le mot de passe dans la variable et le fichier.
    		PGpassword=""
    		rm $HOME/.pgpass
    fi
    Cordialement,
    Vandman

  4. #4
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    Le script de restauration que j'ai écrit ne fonctionne pas. Après restauration, j'ai de grosse erreur dans l'application.
    Les données sont bien là , mais ca ne foncionne pas.

    Comment faire pour corriger mon code pour restaurer?

    Cordialement,
    vandman

  5. #5
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,
    J'ai trouvé la solution, le script d'import semble fonctionner, il me manquait des fonctions que j'ai ajouté.
    Pour l'instant ça a l'aire de fonctionner.

    Cordialement,
    Vandman

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/01/2011, 21h50
  2. Migrer Samba sur un autre serveur sans perdre les machines
    Par max-mag dans le forum Administration système
    Réponses: 10
    Dernier message: 12/05/2009, 09h57
  3. [phpMyAdmin] réinstaller phpMyAdmin sans perdre les données
    Par jul.oob dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 03/05/2007, 15h26
  4. Mise à jour BDD sans perdre les données
    Par penchu dans le forum Accès aux données
    Réponses: 4
    Dernier message: 07/02/2007, 11h21
  5. Afficher un message sans bloquer les autres traitements??
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 7
    Dernier message: 13/10/2005, 00h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo