web-dev-qa-db-fra.com

Erreur PostgreSQL 9.1 pg_restore concernant PLPGSQL

J'utilise Postgres pour un projet Django et j'implémente actuellement un système de sauvegarde/restauration de base de données qui effectue le plus simplement possible un pg_dump lorsque l'utilisateur clique sur sauvegarde, puis pg_restore lorsqu'il clique sur restaurer la sauvegarde.

Tout semble bien et dandy jusqu'à ce qu'il essaie réellement d'effectuer le pg_restore auquel moment il donne cette erreur:

pg_restore: [archiveur (db)] Erreur de l'entrée de table des matières 3206; 0 0 EXTENSION DE COMMENTAIRE plpgsql pg_restore: [l'archiveur (db)] n'a pas pu exécuter la requête: ERREUR: doit être propriétaire de l'extension plpgsql La commande était: COMMENTAIRE SUR L'EXTENSION plpgsql IS 'PL/pgSQL langage procédural') ;

J'ai regardé ce qu'est plpgsql, etc. et je comprends cela, et en ce qui concerne l'erreur, j'ai essayé de définir manuellement le "propriétaire de l'extension" à l'utilisateur qui exécute le script et possède la base de données elle-même, mais cela n'a rien changé, c'est vraiment ennuyeux depuis son erreur sur une tentative de définir un commentaire de toutes choses

Tout est créé automatiquement par pg_dump donc la ligne de commentaire ne peut pas être supprimée et il n'y a pas de drapeaux pour désactiver les commentaires (à ma connaissance), donc je suis vraiment coincé sur la façon de résoudre ce problème.

63
fury-s12

Il semble que pg_restore essaie de restaurer des données supplémentaires que vous ne possédez pas. Essayez d'ajouter -n public option sur votre ligne de commande pg_restore. Il indiquera à pg_restore de restaurer uniquement le contenu du schéma public. Votre ligne de commande devrait ressembler à

pg_restore -U username -c -n public -d database_name
112
Roman Akinfold

J'ai trouvé la solution de contournement suivante sur cette page:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

L'idée est d'utiliser pg_restore -l pour lister le contenu de l'archive, d'extraire l'extension que l'utilisateur n'a pas l'autorisation de restaurer et d'utiliser pg_restore -L pour utiliser cette liste élidée lors de la restauration.

Par exemple:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
14
rantler

Si possible, je vous recommande de supprimer le commentaire qui ne parvient pas à restaurer avant de créer des vidages.

Vous pouvez le faire en:

COMMENT ON EXTENSION plpgsql IS null;

Si vous ne souhaitez pas effectuer cette opération pour chaque base de données nouvellement créée, supprimez le commentaire de la base de données appelé template1 (CREATE DATABASE… copie cette base de données.)

Les vidages créés après cela devraient être restaurés sans erreur.

4
Peter Gerber

Chargez-vous dans une base de données créée par un autre utilisateur? Si possible, essayez de restaurer en utilisant le même utilisateur qui a créé la base de données et ses objets existants.

2
Edmund

Fonctionne pour moi après cette commande -

Deepak@deepak:~$ Sudo -i -u postgres
postgres@deepak:~$ psql 
psql (9.3.5)
Type "help" for help.

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user;
postgres=# GRANT
2
Deepak Mahakale