J'ai vidé une sauvegarde propre, pas de propriétaire pour la base de données Postgres avec la commande
pg_dump sample_database -O -c -U
Plus tard, lorsque je restaure la base de données avec
psql -d sample_database -U app_name
Cependant, j'ai rencontré plusieurs erreurs qui m'empêchent de restaurer les données:
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema "public" already exists
ERROR: must be owner of schema public
CREATE EXTENSION
ERROR: must be owner of extension plpgsql
J'ai fouillé dans le texte brut pg_dump
généré par SQL et j'ai trouvé qu'il contient du SQL
CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Je pense que les causes sont que l'utilisateur app_name
n'a pas les privilèges pour modifier le public
schéma et plpgsql
.
Comment pourrais-je résoudre ce problème?
postgresql
database-backups
rails-postgresql
steveyang
la source
la source
plpgsql
, alorsDROP EXTENSION plpgsql
avant vouspg_dump
. C'est plus sûr que de faire de votre application un super utilisateur, et c'est plus pratique que d'ignorer les erreurs (quelles bombes si vous utilisez--single-transaction
ou-v ON_ERROR_STOP=1
). C'est un problème connu, [discuté en détail par les développeurs de Postgres | postgresql.org/message-id/... mais non corrigé à partir de la version 9.3.Réponses:
Pour résoudre le problème, vous devez attribuer les autorisations de propriété appropriées. Essayez ce qui suit qui devrait résoudre tous les problèmes liés aux autorisations pour des utilisateurs spécifiques, mais comme indiqué dans les commentaires, cela ne doit pas être utilisé en production:
Alors connectez-vous à la base de données sous un compte superutilisateur
sudo -u postgres psql
et exécutez uneALTER ROLE <user-name> Superuser;
déclaration.Gardez à l'esprit que ce n'est pas la meilleure solution sur un serveur d'hébergement multi-site, alors jetez plutôt un œil à l'attribution de rôles individuels: https://www.postgresql.org/docs/current/static/sql-set-role.html et https : //www.postgresql.org/docs/current/static/sql-alterrole.html .
la source
app_user
n'est pas un super utilisateur.superuser
Utilisateurs AWS RDS si vous obtenez cela, c'est parce que vous n'êtes pas un super-utilisateur et, selon la documentation aws, vous ne pouvez pas en être un. J'ai constaté que je devais ignorer ces erreurs.
la source
COMMENT ON EXTENSION
nonCREATE EXTENSION
. Supprimez les commentaires et ça devrait aller.Pour les utilisateurs de Google Cloud Platform, toute erreur arrêtera le processus d'importation. Personnellement, j'ai rencontré deux erreurs différentes en fonction de la commande pg_dump que j'ai émise:
1-
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Se produit lorsque vous avez essayé de vider votre base de données dans un format de texte non brut. C'est-à-dire lorsque la commande n'a pas le paramètre -Fp ou --format = plain. Cependant, si vous l'ajoutez à votre commande, vous pouvez alors rencontrer l'erreur suivante:
2-
SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql
Il s'agit d'un problème d'autorisation que je n'ai pas pu résoudre à l'aide de la commande fournie dans la documentation GCP , des conseils de ce fil de discussion actuel ou des conseils de l'équipe Google Postgres ici . Qui a recommandé d'émettre la commande suivante:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
La seule chose qui a fait l'affaire dans mon cas était d'éditer manuellement le fichier de vidage et de commenter toutes les commandes relatives à plpgsql.
J'espère que cela aidera les âmes dépendantes de GCP.
Mettre à jour :
Il est plus facile de vider le fichier en commentant les extensions, d'autant plus que certains vidages peuvent être énormes:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql
Ce qui peut être réduit à plpgsql:
pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql
la source
pg_dump
commande exacte à utiliser dans ses documents :pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \ | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql
Vous pouvez probablement ignorer les messages d'erreur en toute sécurité dans ce cas. Ne pas ajouter de commentaire au schéma public et installer plpgsql (qui devrait déjà être installé) ne causera pas de vrais problèmes.
Cependant, si vous souhaitez effectuer une réinstallation complète, vous aurez besoin d'un utilisateur disposant des autorisations appropriées. Cela ne devrait pas être l'utilisateur que votre application exécute régulièrement, bien sûr.
la source
Réponse plus courte: ignorez-la.
Ce module fait partie de Postgres qui traite le langage SQL. L'erreur apparaîtra souvent dans le cadre de la copie d'une base de données distante, comme avec un «heroku pg: pull». Il n'écrase pas votre processeur SQL et vous en avertit.
la source
Essayez d'utiliser l'
-L
indicateur avec pg_restore en spécifiant le fichier extrait depg_dump -Fc
https://www.postgresql.org/docs/9.5/app-pgrestore.html
Ici, vous pouvez voir que l' inverse est vrai en ne produisant que le commentaire:
la source
Pour les personnes utilisant AWS , le
COMMENT ON EXTENSION
n'est possible qu'en tant que super - utilisateur , et comme nous le savons par la documentation, les instances RDS sont gérées par Amazon. En tant que tel, pour vous empêcher de casser des choses comme la réplication, vos utilisateurs - même l'utilisateur root que vous avez configuré lorsque vous créez l'instance - n'auront pas les privilèges de superutilisateur complets:http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
Afin de corriger cette erreur, utilisez simplement
--
pour commenter les lignes de SQL qui contiennentCOMMENT ON EXTENSION
la source
pg_dump --no-comments
.Utilisez l'utilisateur postgres (admin) pour vider le schéma, le recréer et accorder des privilèges à utiliser avant d'effectuer votre restauration. En une seule commande:
la source
Pour moi, je configurais une base de données avec pgAdmin et il semble que la configuration du propriétaire lors de la création de la base de données n'était pas suffisante. J'ai dû naviguer vers le schéma «public» et y définir le propriétaire (à l'origine, «postgres»).
la source
Pour les personnes qui ont réduit le problème aux
COMMENT ON
déclarations (conformément aux différentes réponses ci-dessous) et qui ont un accès superutilisateur à la base de données source à partir de laquelle le fichier de vidage est créé, la solution la plus simple pourrait être d'empêcher les commentaires d'être inclus dans le vidage. fichier en premier lieu, en les supprimant de la base de données source en cours de vidage ...Les futurs vidages n'incluront donc pas les
COMMENT ON
déclarations.la source
rails db:reset
sur une instance postgresql AWS RDS sans avoir à supprimer les lignes COMMENT ON du fichier de vidage chaque fois que j'exécute un schéma migration.