J'utilise pg_dump / pg_restore pour sauvegarder et restaurer une base de données PostgreSQL, mais je reçois des messages d'erreur (et un état de sortie non nul) de pg_restore. J'ai essayé un cas de base super simple (décrit ci-dessous) mais j'ai quand même eu ces erreurs:
pg_restore: [archiveur (db)] Erreur lors du traitement de la table des matières: pg_restore: [archiveur (db)] Erreur de l'entrée 5 de la table des matières; 2615 2200 SCHEMA postgres publics pg_restore: [archiveur (db)] n'a pas pu exécuter la requête: ERREUR: le schéma "public" existe déjà La commande était: CREATE SCHEMA public;
Étapes à reproduire:
- Installez une nouvelle distribution Ubuntu 14.04 vanille (j'utilise Vagrant avec cette boîte Vagrant ).
- Installez PostgreSQL 9.3, configurez pour autoriser les connexions locales en tant qu'utilisateur PostgreSQL "postgres" à partir de n'importe quel utilisateur Linux.
Créez une base de données de test. Je fais juste:
vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres postgres psql (9.3.5) Tapez "help" pour obtenir de l'aide. postgres = # create database mydb; CRÉER UNE BASE DE DONNÉES postgres = # \ q vagrant @ vagrant-ubuntu-trusty-64: ~ $ psql --username = postgres mydb psql (9.3.5) Tapez "help" pour obtenir de l'aide. mydb = # créer des données de table (entrée bigint); CRÉER UNE TABLE mydb = # insérer dans les valeurs de données (1); INSÉRER 0 1 mydb = # insérer dans les valeurs de données (2); INSÉRER 0 1 mydb = # insérer dans les valeurs de données (3); INSÉRER 0 1 mydb = # \ q
Créez une sauvegarde de la base de données comme ceci:
PGPASSWORD = "postgres" pg_dump --dbname = mydb --username = postgres --format = custom> pg_backup.dump
Supprimez quelques lignes du tableau de données dans mydb afin que nous puissions savoir si nous avons restauré les données avec succès.
Restaurez la base de données avec:
PGPASSWORD = "postgres" pg_restore --clean --create --dbname = postgres --username = postgres pg_backup.dump
Les données sont restaurées, mais la commande pg_restore à l'étape 6 se termine avec l'état 1
et affiche la sortie suivante:
pg_restore: [archiveur (db)] Erreur lors du traitement de la table des matières: pg_restore: [archiveur (db)] Erreur de l'entrée 5 de la table des matières; 2615 2200 SCHEMA postgres publics pg_restore: [archiveur (db)] n'a pas pu exécuter la requête: ERREUR: le schéma "public" existe déjà La commande était: CREATE SCHEMA public; AVERTISSEMENT: erreurs ignorées lors de la restauration: 1
Je ne peux pas simplement ignorer cela car j'exécute cette commande par programme et j'ai besoin d'utiliser l'état de sortie pour déterminer si la restauration a échoué ou non. Au départ, je me demandais si ce problème était dû au fait que je mettais ma base de données en public (le schéma par défaut). J'ai pensé que public serait créé à la suite de l' --create
option de pg_restore avant que les données ne soient restaurées (ce qui pourrait également essayer de créer ce schéma car c'est là que se trouve ma table), mais quand j'ai essayé les étapes ci-dessus avec ma table dans un schéma différent, les résultats étaient les mêmes et les messages d'erreur étaient identiques.
Est-ce que je fais quelque chose de mal? Pourquoi est-ce que je vois cette erreur?
la source
--create
sansclean
ne résout pas le problème.Dans mon cas, la raison était que j'utilisais à
pg_restore
partir de la version 11.2 de postgresql-contrib pour restaurer un vidage effectué parpg_dump
9.6 vers un cluster PostgreSQL 9.6.Après avoir rétrogradé mon
pg_restore
dos à 9.6, cetteschema "public" already exists
erreur a disparu et le processus de restauration a fonctionné comme auparavant.la source