Cómo resolver problemas de privilegios al restaurar la base de datos PostgreSQL

105

He descargado una copia de seguridad limpia, sin propietario para la base de datos de Postgres con el comando

pg_dump sample_database -O -c -U

Más tarde, cuando restaure la base de datos con

psql -d sample_database -U app_name

Sin embargo, encontré varios errores que me impiden restaurar los datos:

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

Investigué en el texto sin formato que pg_dumpgenera SQL y encontré que 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';

Creo que las causas son que el usuario app_nameno tiene los privilegios para alterar el publicesquema y plpgsql.

¿Cómo puedo solucionar este problema?

Steveyang
fuente
5
Si no lo necesita plpgsql, entonces DROP EXTENSION plpgsqlantes que usted pg_dump. Esto es más seguro que convertir tu aplicación en un superusuario, y es más conveniente que ignorar los errores (lo que bombardea si usas --single-transactiono -v ON_ERROR_STOP=1). Este es un problema conocido, [discutido en profundidad por los desarrolladores de Postgres | postgresql.org/message-id/… pero no corregido a partir de 9.3.
Mark E. Haase

Respuestas:

63

Para resolver el problema, debe asignar los permisos de propiedad adecuados. Pruebe lo siguiente, que debería resolver todos los problemas relacionados con los permisos para usuarios específicos, pero como se indica en los comentarios, esto no debería usarse en producción:

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

Así que conéctese a la base de datos con una cuenta de superusuario sudo -u postgres psqly ejecute una ALTER ROLE <user-name> Superuser;declaración.

Tenga en cuenta que esta no es la mejor solución en el servidor de alojamiento de múltiples sitios, así que eche un vistazo a la asignación de roles individuales en su lugar: https://www.postgresql.org/docs/current/static/sql-set-role.html y https : //www.postgresql.org/docs/current/static/sql-alterrole.html .

Daniel Sokolowski
fuente
28
¿Hay alguna forma de hacer esto sin ser un superusuario?
Travis Webb
17
"debe asignar los permisos de propiedad adecuados" y "alterar rol <nombre de usuario> superusuario" no son congruentes. La propiedad adecuada significaría que noapp_user es un superusuario.
Mark E. Haase
@mehaase, actualice la redacción de la respuesta en lugar de votar en contra.
Daniel Sokolowski
5
En mi humilde opinión, esto no es una solución, sino una solución que debe evitarse en la producción.
Dmytriy Voloshyn
6
Es una mala sugerencia hacer un usuario normalsuperuser
Evren Yurtesen
55

Usuarios de AWS RDS, si obtiene esto, es porque no es un superusuario y, de acuerdo con la documentación de AWS, no puede serlo. He descubierto que tengo que ignorar estos errores.

Jim Zucker
fuente
5
Este error impide que se complete la restauración (AWS RDS pg_restore). ¿Algún consejo para ignorar estos errores?
avjaarsveld
PD: no usé -e o --exit-on-error para pg_restore
avjaarsveld
7
Descubrí que, en RDS, el problema COMMENT ON EXTENSIONno es CREATE EXTENSION. Elimine los comentarios y debería estar bien.
pkoch
@pkoch lo mismo con Google Cloud Storage. COMENTARIO SOBRE LA EXTENSIÓN fue el problema y no es necesario
Jaybeecave
25

Para las personas que usan Google Cloud Platform, cualquier error detendrá el proceso de importación. Personalmente, encontré dos errores diferentes según el comando pg_dump que emití:

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

Ocurre cuando ha intentado volcar su base de datos en un formato que no es de texto plano. Es decir, cuando el comando carece del parámetro -Fp o --format = plain. Sin embargo, si lo agrega a su comando, puede encontrar el siguiente error:

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

Este es un problema de permisos que no he podido solucionar utilizando el comando proporcionado en los documentos de GCP , los consejos de este hilo actual o siguiendo los consejos del equipo de Google Postgres aquí . Lo que recomendó emitir el siguiente comando:

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

Lo único que funcionó en mi caso fue editar manualmente el archivo de volcado y comentar todos los comandos relacionados con plpgsql.

Espero que esto ayude a las almas que dependen de GCP.

Actualización:

Es más fácil volcar el archivo comentando las extensiones, especialmente porque algunos volcados pueden ser enormes: pg_dump ... | grep -v -E '(CREATE\ EXTENSION|COMMENT\ ON)' > mydump.sql

Que se puede reducir a plpgsql: pg_dump ... | grep -v -E '(CREATE\ EXTENSION\ IF\ NOT\ EXISTS\ plpgsql|COMMENT\ ON\ EXTENSION\ plpgsql)' > mydump.sql

Stanislasdrg reinstalar a Monica
fuente
1
GCP ahora tiene el pg_dumpcomando exacto para usar en sus documentos :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

Probablemente pueda ignorar con seguridad los mensajes de error en este caso. No agregar un comentario al esquema público e instalar plpgsql (que ya debería estar instalado) no causará ningún problema real.

Sin embargo, si desea realizar una reinstalación completa, necesitará un usuario con los permisos adecuados. Por supuesto, ese no debería ser el usuario que su aplicación ejecuta habitualmente.

Richard Huxton
fuente
12

Respuesta más corta: ignóralo.

Este módulo es la parte de Postgres que procesa el lenguaje SQL. El error a menudo aparecerá como parte de la copia de una base de datos remota, como con un 'heroku pg: pull'. No sobrescribe su procesador SQL y le advierte sobre eso.

Charles Merriam
fuente
10

Intente usar la -Lbandera con pg_restore especificando el archivo tomado depg_dump -Fc

-L archivo-lista --use-list = archivo-lista

Restaure solo los elementos de archivo que se enumeran en list-file y restaurelos en el orden en que aparecen en el archivo. Tenga en cuenta que si se utilizan modificadores de filtrado como -n o -t con -L, restringirán aún más los elementos restaurados.

El archivo de lista normalmente se crea editando la salida de una operación -l previa. Las líneas se pueden mover o eliminar, y también se pueden comentar colocando un punto y coma (;) al principio de la línea. Consulte los ejemplos a continuación.

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

Aquí puede ver que la inversa es verdadera al generar solo el comentario:

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
--
Ligemer
fuente
Creo que lo anterior es correcto, excluir los comentarios de los complementos no afectará la funcionalidad de su aplicación
Andreas
3

Para las personas que usan AWS , COMMENT ON EXTENSIONsolo es posible como superusuario y, como sabemos por los documentos, las instancias de RDS son administradas por Amazon. Como tal, para evitar que rompa cosas como la replicación, sus usuarios, incluso el usuario raíz que configuró cuando creó la instancia, no tendrán privilegios de superusuario completos:

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

Cuando crea una instancia de base de datos, la cuenta del sistema de usuario maestro que crea se asigna a la función rds_superuser. La función rds_superuser es una función predefinida de Amazon RDS similar a la función de superusuario de PostgreSQL (normalmente denominada postgres en instancias locales), pero con algunas restricciones. Al igual que con la función de superusuario de PostgreSQL, la función rds_superuser tiene la mayor cantidad de privilegios en su instancia de base de datos y no debe asignar esta función a los usuarios a menos que necesiten el mayor acceso a la instancia de base de datos.

Para corregir este error, solo use --para comentar las líneas de SQL que contieneCOMMENT ON EXTENSION

Petar Nikov
fuente
2
O comentarios Omitir al descargar: pg_dump --no-comments.
Dmitrii I.
2

Utilice el usuario de postgres (administrador) para volcar el esquema, recrearlo y otorgar privilegios para su uso antes de realizar la restauración. En 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
Pascal_dher
fuente
1

Para mí, estaba configurando una base de datos con pgAdmin y parece que establecer el propietario durante la creación de la base de datos no fue suficiente. Tuve que navegar hasta el esquema 'público' y establecer el propietario allí también (originalmente era 'postgres').

Peter L
fuente
0

Para las personas que han reducido el problema a las COMMENT ONdeclaraciones (según varias respuestas a continuación) y que tienen acceso de superusuario a la base de datos de origen desde la que se crea el archivo de volcado, la solución más simple podría ser evitar que los comentarios se incluyan en el volcado. archivo en primer lugar, eliminándolos de la base de datos de origen que se está volcando ...

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

Los volcados futuros no incluirán las COMMENT ONdeclaraciones.

Mark Schneider
fuente
1
Desarrollando localmente en Rails (que crea un nuevo archivo de volcado automáticamente cada vez que se ejecuta una migración de esquema), esta solución me permite simplemente ejecutar rails db:reseten una instancia postgresql de AWS RDS sin tener que eliminar las líneas COMMENT ON del archivo de volcado cada vez que ejecuto un esquema migración.
Mark Schneider