Restaurer PostgreSQL db à partir d'une sauvegarde sans contrainte de clé étrangère problème
J'ai un postgresql db 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 près de 10 à 12 MO. Maintenant, le problème, je suis confronté est qu'à chaque fois que j'essaie de restaurer la base de données, la contrainte de clé étrangère problème. Le scénario est comme suit:
Il y a deux tableaux: 1) users
et 2) zones
. Je stocke l'id de zone dans users
table d'identifier la zone de l'utilisateur et que vous avez défini comme clé étrangère.
Quand je prends le dump de la db, les entrées de la table de zones
ne viennent qu'après celle de la table users
. Je pense que c'est dû à la première lettre du nom de la table: u
vient avant z
, et, par conséquent, lors de la restauration de la base de données, une contrainte de clé étrangère problème se produit et l'exécution s'arrête. Le même problème se produit lorsque j'essaie de restaurer la structure db, il est dit que le tableau zones
n'existe pas dans la base de données depuis la structure de zones
vient après celle de users
dans le fichier de vidage.
Est qu'il ya une solution pour cela? Est-il une autre méthode de sauvegarde est-elle réalisable?
OriginalL'auteur Black Rider | 2011-03-19
Vous devez vous connecter pour publier un commentaire.
Sons comme si vous obtenez un dump SQL plutôt que d'un cliché binaire de
pg_dump
. Qui vous donnerait un gros tas de SQL avec le schéma (y compris les FKs) à la partie supérieure, suivie par un tas de plaquettes de recharger les données. Un cliché binaire depg_dump
serait de vous servir au mieux, il semble que vous avez besoin d'un peu de configuration à dire PhpPgAdmin oùpg_dump
est. Alors vous feriez flux binaires de vidage enpg_restore
etpg_restore
la reconstruction de tout dans le bon ordre afin d'éviter des problèmes d'intégrité référentielle (ou, plus exactement,pg_restore
serait de restaurer toutes les données, puis ajouter les contraintes).PhpPgAdmin semble vouloir travailler avec plaine dumps SQL plutôt que
pg_restore
. Je trouve cela difficile à croire, mais je ne trouve rien dans la documentation sur le lancement d'pg_restore
. Si cela est vrai, alors vous aurez probablement à main-modifier le dump SQL et déplacer tous les FKs à la fin.Vous pourriez également essayer d'ajouter
DÉFINIR les CONTRAINTES de TOUS les DIFFÉRÉE;
en haut de votre dump SQL, qui devrait retarder la vérification des contraintes jusqu'à la fin de la transaction, vous voudrez également vous assurer que l'ensemble du bloc de plaquettes est contenue à l'intérieur d'une transaction.Si PhpPgAdmin vraiment ne peut pas invoquer
pg_restore
alors vous êtes mieux de les utiliser à l'aide depg_dump
etpg_restore
par la main de sorte que vous avez le contrôle nécessaire sur vos procédures de sauvegarde. Désolé, mais aucune base de données de l'outil d'administration qui ne peut pas gérer la sauvegarde d'une base de données avec FKs est pire qu'inutile. J'espère que quelqu'un qui connaît son chemin autour de PhpPgAdmin va se montrer et laissez-nous savoir comment utiliserpg_restore
avec PhpPgAdmin.Vous devez être restaurées dans une base de données vide, puis
pg_restore
va mettre tout en place. Ou, si vous avez le schéma déjà en place, mais pas de données, vous pouvez direpg_restore
juste de restaurer les données. Sonne comme le schéma existe déjà et de la restauration est en train de restaurer le schéma.OriginalL'auteur mu is too short
Si ça aide quelqu'un: aucune des solutions précédentes ont suggéré fonctionné pour moi (il y avait des INSERTs en référence aux données qui ont été sous-évaluées plus tard, indépendante si elle était dans un format binaire, ou de simples requêtes SQL).
Ce que j'ai fait: j'ai utilisé schemaspy, un script qui -parmi d'autres caractéristiques, comme le sont vraiment utiles html diagramme de la sous-ER modèle - il génère deux très utile listes: un "ordre d'insertion" (où toutes les tables sont répertoriées comme un ordre optimal dans le but d'effectuer des insertions, compte tenu des restrictions actuelles et les dépendances), et un "la suppression de l'ordre" (très utile pour supprimer des tables).
Si vous voulez un exemple, cochez cette http://schemaspy.sourceforge.net/sample/. En particulier, il y a deux exemples de listes je l'ai mentionné juste au-dessus (essayé de poster des liens directs mais le spam mécanisme de prévention, me permet de poster juste 2 liens).
OriginalL'auteur jquinter
Êtes-vous sûr de PhpPgAdmin est à l'aide de pg_dump pour créer des sauvegardes? Je n'ai jamais vu aucun dump faite par pg_dump, à avoir des problèmes avec les clés étrangères lors de la restauration de la sauvegarde.
PhpPgAdmin est juste un script PHP et dans la plupart des cas, il n'aura pas les autorisations pour démarrer un programme comme pg_dump.
OriginalL'auteur Frank Heikens
Je voudrais supprimer le fk création à l'avant et l'ajouter à la fin du script.
OriginalL'auteur Kuberchaun
J'ai trouvé que vous pouvez ajouter dans le début du sql (cela va arrêter de clé étrangère chèques):
SET session_replication_role = replica;
et à la fin (à restaurer les contrôles):
SET session_replication_role = origin;
OriginalL'auteur venimus