10
votes

Restaurer PostgreSQL DB de la sauvegarde sans contrainte de clé étrangère

J'ai un dB PostgreSQL avec environ 85 tables. Je fais des sauvegardes régulièrement à l'aide de pg_dump (via php-pgadmin) en mode copie et la taille du fichier de sauvegarde est de près de 10-12 Mo. Maintenant, le problème que je suis confronté est que chaque fois que j'essaie de restaurer la base de données, un problème de contrainte de clé étrangère se produit. Le scénario est comme suit:

Il y a deux tables: 1) utilisateurs et 2) zones . J'ai stocké l'identifiant de la zone dans des utilisateurs pour identifier la zone de l'utilisateur et l'avoir défini comme clé étrangère.

Lorsque je prends la DUMP DB, les entrées de la table Zones ne sont arrivées qu'après celle du tableau des utilisateurs . Je pense que c'est dû à la première lettre du nom de la table: u est livré avant z , et donc lorsque je restaure la base de données, un problème de contrainte de clé étrangère se produit et l'exécution s'arrête. Le même problème se produit lorsque j'essaie de restaurer la structure de base de données, il est indiqué que le tableau Zones n'existe pas dans la base de données depuis la structure de Zones vient après celui de Utilisateurs dans le fichier de vidage.

Y a-t-il une solution pour cela? Y a-t-il une autre méthode de sauvegarde réalisable?


1 commentaires

En fait, j'envoie le décharge que j'ai reçu de phppgadmin en tant que SQL via une interface phppgadmin .....


6 Réponses :


1
votes

Utilisation de PGDump (via PHP-PGADMIN)

Êtes-vous sûr que phppgadmin utilise pg_dump pour créer des sauvegardes? Je n'ai jamais vu de décharge faite par pg_dump, avoir des problèmes avec des clés étrangères lors de la restauration du décharge.

phppgadmin n'est qu'un script PHP et dans la plupart des cas, il n'aura pas d'autorisations pour démarrer un programme comme pg_dump.


1 commentaires

Je croyais que phppgadminmin utilise pgdump pour faire des sauvegardes ... je me trompe ??? [link] en.wikipedia.org/wiki/phppgadmin[link] dit Peut utiliser pg_dump .. mais je ne sais pas si l'interface utilise pg_dump lorsque le dumping est terminé ... peut-on le confirmer?



0
votes

Je supprimerais la création FK à l'avant et l'ajoutez à la fin du script.


0 commentaires

8
votes

sonne comme si vous obtenez un vidage SQL plutôt qu'un vidage binaire de pg_dump . Cela vous donnerait un gros tas de SQL avec le schéma (y compris FKS) au sommet suivi d'un tas d'insertions pour recharger les données. Une vidage binaire de pg_dump vous servirait mieux, on dirait que vous avez besoin d'un peu de configuration supplémentaire pour dire phppgadmin où pg_dump est. Ensuite, vous nourririez cette vidage binaire dans pg_restore et pg_restore rétablirait tout dans l'ordre approprié pour éviter les problèmes d'intégrité référentielle (ou, plus précisément, pg_restore restaurerait toutes les données puis ajouter les contraintes).

phppgadmin semble vouloir vouloir Travailler avec des vidages SQL simples plutôt que pg_restore . Je trouve cela difficile à croire, mais je ne trouve rien dans la documentation sur l'invocation pg_restore . Si cela est vrai, vous devrez probablement modifier la décharge SQL et déplacer tout le FKS jusqu'à la fin.

Vous pouvez également essayer d'ajouter Définir les contraintes reportées ; en haut de votre vidage SQL, qui devrait retarder la vérification des contraintes jusqu'à la fin de la transaction, vous souhaitez également vous assurer que l'ensemble du bloc d'insertions est contenu dans une transaction. < / p>

Si phppgadmin ne peut vraiment pas appeler pg_restore alors vous ferez mieux d'utiliser à l'aide de pg_dump et pg_restore à la main afin que vous ayez le Contrôle nécessaire sur vos procédures de sauvegarde. Désolé, mais tout outil d'administration de base de données qui ne peut pas gérer la sauvegarde d'une base de données avec FKS est pire que inutile. Espérons que quelqu'un qui sait que PhPPGADmin, vous montrera et laissez-nous savoir comment utiliser pg_restore avec phppgadmin.


2 commentaires

Ya pg_restore était ce que je voulais .. Maintenant, la migration de données fonctionne bien, mais un nouveau problème maintenant ... Lorsque j'importe la structure de base de données et l'utilisateur pg_restore pour la restaurer dans une nouvelle base de données, une erreur comme "la séquence x existe déjà" vient .. J'ai constaté que le problème est que le type de données des champs d'auto-incrémentation automatique est BigSerial dans la DBH Dump, de sorte que Postgree crée automatiquement une séquence basée sur le nom de la colonne .. Mais en dessous de l'instruction Créer une table, le Dump a une séquence de création. Déclaration qui crée une séquence avec le même nom que l'une auto générée par Postgres et celle-ci jette une erreur..any Solution?


@MidHun: Vous devriez être de restauration dans une base de données vide, puis pg_restore permettra de tout définir. Ou, si vous avez déjà le schéma déjà en place, mais aucune donnée, vous pouvez indiquer pg_restore pour restaurer les données. On dirait que le schéma est déjà là et votre restauration tente de restaurer également le schéma.



3
votes

Si cela aide n'importe qui: aucune des solutions précédentes suggérées a fonctionné pour moi (certains insertions ont fait référence aux données de référence qui a été larguée ultérieurement sur, indépendante si elle était au format binaire, ou des requêtes SQL simples).

Qu'est-ce que j'ai fait: j'ai utilisé Schemaspy , un script qui -among d'autres fonctionnalités, telles que vraiment utiles Diagramme HTML du modèle er sous-jacent - Il génère deux listes très utiles: un "ordre d'insertion" (où toutes vos tables sont répertoriées comme une ordonnance optimale afin d'effectuer des insertions, en tenant compte des restrictions et des dépendances existantes) et d'une "ordonnance de suppression" "(très utile pour déposer des tables).

Si vous voulez un échantillon, cochez ce http://schemaspy.sourceforge.net/sample/. En particulier, il existe deux recherches d'échantillons que j'ai mentionnées ci-dessus (essayé de poster des liens directs, mais le mécanisme de prévention du spam me permet de poster 2 liens).



1
votes

J'ai trouvé que vous pouviez ajouter au début de la SQL (cela arrêtera les contrôles de clé étrangère):

SET Session_Replication_Role = Réplique;

et à la fin (pour restaurer les chèques):

SET Session_Replication_Role = Origine;


0 commentaires

1
votes

J'ai fait face à cette situation une fois, j'ai eu la sauvegarde de la structure et des données dans des fichiers séparés, c'est ainsi que j'ai été en mesure de restaurer les informations: xxx

restaurer la base de données de la base de données de PG admin xxx


0 commentaires