Come risolvere i problemi di privilegi durante il ripristino del database PostgreSQL


105

Ho scaricato un backup pulito, senza proprietario per il database Postgres con il comando

pg_dump sample_database -O -c -U

Successivamente, quando ripristino il database con

psql -d sample_database -U app_name

Tuttavia, ho riscontrato diversi errori che mi impediscono di ripristinare i dati:

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

Ho scavato nel testo semplice pg_dumpgenerato da SQL e ho scoperto che contiene 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';

Penso che le cause siano che l'utente app_namenon ha i privilegi per modificare lo publicschema e plpgsql.

Come potrei risolvere questo problema?


5
Se non ti serve plpgsql, DROP EXTENSION plpgsqlprima di te pg_dump. Questo è più sicuro che rendere la tua app un super utente ed è più conveniente che ignorare gli errori (che bombe se usi --single-transactiono -v ON_ERROR_STOP=1). Questo è un problema noto, [discusso a lungo dagli sviluppatori di Postgres | postgresql.org/message-id/… ma non risolto a partire da 9.3.
Mark E. Haase

Risposte:


63

Per risolvere il problema è necessario assegnare le autorizzazioni di proprietà appropriate. Prova quanto segue che dovrebbe risolvere tutti i problemi relativi alle autorizzazioni per utenti specifici ma, come indicato nei commenti, non dovrebbe essere utilizzato in produzione:

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=#

Quindi connettiti al database con un account Superuser sudo -u postgres psqled esegui ALTER ROLE <user-name> Superuser;un'istruzione.

Tieni presente che questa non è la soluzione migliore su server di hosting multisito, quindi dai un'occhiata all'assegnazione di ruoli individuali: https://www.postgresql.org/docs/current/static/sql-set-role.html e https : //www.postgresql.org/docs/current/static/sql-alterrole.html .


28
c'è un modo per farlo senza essere un superutente?
Travis Webb

17
"deve assegnare i permessi di proprietà appropriati" e "alterare ruolo <nome utente> superutente" non sono congruenti. Una corretta proprietà significherebbe che nonapp_user è un super utente.
Mark E. Haase

@mehaase, per favore aggiorna la formulazione della risposta invece del voto negativo.
Daniel Sokolowski

5
IMHO questa non è una soluzione ma una soluzione alternativa che dovrebbe essere evitata in produzione.
Dmytriy Voloshyn

6
È un cattivo suggerimento per un utente normalesuperuser
Evren Yurtesen

55

Utenti di AWS RDS, se ottieni questo, è perché non sei un superutente e secondo la documentazione di aws non puoi esserlo. Ho scoperto di dover ignorare questi errori.


5
Questo errore impedisce il completamento del ripristino per me (AWS RDS pg_restore). Qualche consiglio per ignorare questi errori?
avjaarsveld

PS Non ho usato -e o --exit-on-error per pg_restore
avjaarsveld

7
Ho scoperto che, su RDS, il problema è COMMENT ON EXTENSIONno CREATE EXTENSION. Rimuovi i commenti e dovresti stare bene.
pkoch

@pkoch lo stesso con Google Cloud Storage. IL COMMENTO SULL'ESTENSIONE era il problema e non era necessario
Jaybeecave

25

Per le persone che utilizzano Google Cloud Platform, qualsiasi errore interromperà il processo di importazione. Personalmente ho riscontrato due errori diversi a seconda del comando pg_dump che ho emesso:

1- The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.

Si verifica quando si è tentato di eseguire il dump del database in un formato di testo non normale. Cioè quando il comando manca del parametro -Fp o --format = plain. Tuttavia, se lo aggiungi al tuo comando, potresti riscontrare il seguente errore:

2- SET SET SET SET SET SET CREATE EXTENSION ERROR: must be owner of extension plpgsql

Questo è un problema di autorizzazione che non sono riuscito a risolvere utilizzando il comando fornito nei documenti GCP , i suggerimenti di questo thread corrente o seguendo i consigli del team di Google Postgres qui . Che consiglia di emettere il seguente comando:

pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql

L'unica cosa che ha funzionato nel mio caso è stata la modifica manuale del file di dump e il commento di tutti i comandi relativi a plpgsql.

Spero che questo aiuti le anime dipendenti da GCP.

Aggiornare :

È più facile eseguire il dump del file commentando le estensioni, soprattutto perché alcuni dump possono essere enormi: pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

Che può essere ridotto a plpgsql: pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql


1
GCP ora ha il pg_dumpcomando esatto da utilizzare nei propri documenti :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
Rush

14

Probabilmente puoi tranquillamente ignorare i messaggi di errore in questo caso. Non riuscire ad aggiungere un commento allo schema pubblico e installare plpgsql (che dovrebbe essere già installato) non causerà alcun problema reale.

Tuttavia, se desideri eseguire una reinstallazione completa, avrai bisogno di un utente con le autorizzazioni appropriate. Ovviamente non dovrebbe essere l'utente che la tua applicazione esegue regolarmente.


12

Risposta più breve: ignorala.

Questo modulo è la parte di Postgres che elabora il linguaggio SQL. L'errore apparirà spesso durante la copia di un database remoto, ad esempio con un "heroku pg: pull". Non sovrascrive il tuo processore SQL e ti avverte di questo.


10

Prova a utilizzare il -Lflag con pg_restore specificando il file preso dapg_dump -Fc

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

Ripristina solo quegli elementi di archivio che sono elencati in list-file e ripristinali nell'ordine in cui appaiono nel file. Si noti che se si utilizzano opzioni di filtro come -n o -t con -L, limiteranno ulteriormente gli elementi ripristinati.

list-file viene normalmente creato modificando l'output di una precedente operazione -l. Le righe possono essere spostate o rimosse e possono anche essere commentate inserendo un punto e virgola (;) all'inizio della riga. Vedi sotto per esempi.

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

Qui puoi vedere che l' inverso è vero emettendo solo il commento:

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
--

Penso che quanto sopra sia corretto, escludere i commenti per i plugin non influirà sulla funzionalità della tua app
Andreas

3

Per le persone che utilizzano AWS , COMMENT ON EXTENSIONè possibile solo come superutente e, come sappiamo dai documenti, le istanze RDS sono gestite da Amazon. In quanto tale, per impedirti di interrompere cose come la replica, i tuoi utenti, anche l'utente root che hai impostato quando crei l'istanza, non disporranno dei privilegi di superutente completi:

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html

Quando crei un'istanza database, l'account di sistema dell'utente master che crei viene assegnato al ruolo rds_superuser. Il ruolo rds_superuser è un ruolo Amazon RDS predefinito simile al ruolo di superutente PostgreSQL (solitamente chiamato postgres nelle istanze locali), ma con alcune limitazioni. Come con il ruolo di superutente PostgreSQL, il ruolo rds_superuser ha il maggior numero di privilegi sulla tua istanza database e non dovresti assegnare questo ruolo agli utenti a meno che non abbiano bisogno del maggior accesso all'istanza database.

Per correggere questo errore, basta usare --per commentare le righe di SQL che contieneCOMMENT ON EXTENSION


2
Oppure ometti i commenti durante il dumping: pg_dump --no-comments .
Dmitrii I.

2

Utilizza l'utente postgres (admin) per eseguire il dump dello schema, ricrearlo e concedere i privilegi per l'uso prima di eseguire il ripristino. In un comando:

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

1

Per me, stavo configurando un database con pgAdmin e sembra che l'impostazione del proprietario durante la creazione del database non fosse sufficiente. Ho dovuto passare allo schema "pubblico" e impostare anche il proprietario (originariamente era "postgres").


0

Per le persone che hanno ristretto il problema alle COMMENT ONistruzioni (come da varie risposte di seguito) e che hanno accesso come superutente al database di origine da cui viene creato il file di dump, la soluzione più semplice potrebbe essere quella di impedire che i commenti vengano inclusi nel dump file in primo luogo, rimuovendoli dal database di origine in fase di dumping ...

COMMENT ON EXTENSION postgis IS NULL;
COMMENT ON EXTENSION plpgsql IS NULL;
COMMENT ON SCHEMA public IS NULL;

I dump futuri quindi non includeranno le COMMENT ONdichiarazioni.


1
Sviluppando localmente in Rails (che crea automaticamente un nuovo file di dump ogni volta che viene eseguita una migrazione di schema), questa soluzione mi consente di eseguire semplicemente rails db:resetsu un'istanza postgresql di AWS RDS senza dover rimuovere le righe COMMENT ON dal file di dump ogni volta che eseguo uno schema migrazione.
Mark Schneider
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.