web-dev-qa-db-fra.com

Comment résoudre les problèmes de privilèges lors de la restauration de la base de données PostgreSQL

J'ai sauvegardé une sauvegarde propre, sans propriétaire pour Postgres Database avec la commande

pg_dump sample_database -O -c -U

Plus tard, quand je restaure la base de données avec

psql -d sample_database -U app_name

Cependant, j'ai rencontré plusieurs erreurs qui m'ont empêché 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 creusé dans le texte brut SQL pg_dump génère 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 schéma public et plpgsql.

Comment pourrais-je résoudre ce problème?

86
steveyang

Pour résoudre le problème, vous devez attribuer les autorisations de propriété appropriées. Essayez ce qui suit devrait résoudre tous les problèmes liés aux autorisations pour des utilisateurs spécifiques, mais comme indiqué dans les commentaires, cela ne devrait pas être utilisé en production:

root@server:/var/log/postgresql# Sudo -u postgres psql
psql (8.4.4)
Type "help" for help.

postgres=# \du
               List of roles
    Role name    | Attributes  | Member of
-----------------+-------------+-----------
 <user-name>    | Superuser   | {}
                 : Create DB
 postgres       | Superuser   | {}
                 : Create role
                 : Create DB

postgres=# alter role <user-name> superuser;
ALTER ROLE
postgres=#

Alors connectez-vous à la base de données sous un compte superutilisateur Sudo -u postgres psql et exécuter un ALTER ROLE <user-name> Superuser; déclaration.

N'oubliez pas que ce n'est pas la meilleure solution sur un serveur d'hébergement multi-site, essayez donc d'attribuer des 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 .

62
Daniel Sokolowski

Utilisateurs d'AWS RDS, si vous obtenez cela, c'est parce que vous n'êtes pas un super-utilisateur et, d'après la documentation d'aws, vous ne pouvez pas en être un. J'ai trouvé que je devais ignorer ces erreurs.

47
Jim Zucker

Pour les personnes utilisant 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. Ie quand la commande manque les paramètres -Fp ou --format = plain. Toutefois, si vous l'ajoutez à votre commande, vous risquez alors de 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 les documents GCP , des astuces de ce fil de discussion actuel ou des conseils de l'équipe Google PostgreSet 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 a été l'édition manuelle du fichier de vidage et la mise en commentaire de toutes les commandes relatives à plpgsql.

J'espère que cela aidera les âmes qui dépendent du GCP.

Mise à jour :

Il est plus facile de vider le fichier en commentant les extensions, d'autant plus que certaines sauvegardes 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

19
Stanislasdrg

Vous pouvez probablement ignorer en toute sécurité les messages d'erreur dans ce cas. Ne pas ajouter de commentaire au schéma public et installer plpgsql (qui devrait déjà être installé) ne poseront pas de problème.

Cependant, si vous souhaitez procéder à 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 comme bien sûr.

12
Richard Huxton

Réponse plus courte: ignorez-le.

Ce module est la partie de Postgres qui traite le langage SQL. L'erreur apparaît souvent lors de la copie d'une base de données distante, par exemple avec un 'heroku pg: pull'. Cela n'écrase pas votre processeur SQL et vous en avertit.

11
Charles Merriam

Essayez d'utiliser le -L drapeau avec pg_restore en spécifiant le fichier pris de pg_dump -Fc

-L list-file --use-list = list-file

Restaurez uniquement les éléments d'archive répertoriés dans le fichier liste et restaurez-les dans l'ordre dans lequel ils apparaissent dans le fichier. Notez que si des commutateurs de filtrage tels que -n ou -t sont utilisés avec -L, ils limiteront davantage les éléments restaurés.

list-file est normalement créé en modifiant le résultat d'une opération -l précédente. Les lignes peuvent être déplacées ou supprimées, et peuvent également être commentées en plaçant un point-virgule (;) au début de la ligne. Voir ci-dessous pour des exemples.

https://www.postgresql.org/docs/9.5/app-pgrestore.html

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep -v 'COMMENT - EXTENSION' > pg_restore.list
pg_restore -L pg_restore.list pg.dump

Ici vous pouvez voir que l'inverse est vrai en ne produisant que le commentaire:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' > pg_restore_inverse.list
pg_restore -L pg_restore_inverse.list pg.dump
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.15
-- Dumped by pg_dump version 9.5.14

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- PostgreSQL database dump complete
--
4
Ligemer

Utilisez l'utilisateur postgres (admin) pour vider le schéma, le créer et octroyer des privilèges avant de procéder à la restauration. En une commande:

Sudo -u postgres psql -c "DROP SCHEMA public CASCADE;
create SCHEMA public;
grant usage on schema public to public;
grant create on schema public to public;" myDBName
2
Pascal_dher

Pour moi, je configurais une base de données avec pgAdmin et il semble que définir le propriétaire lors de la création de la base de données ne suffisait pas. Je devais accéder au schéma 'public' et définir le propriétaire également (à l'origine, il s'agissait de 'postgres').

1
Peter L