recuperar - Cómo resolver problemas de privilegios al restaurar la base de datos PostgreSQL
recuperar contraseña postgresql (7)
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
Excavé en el SQL de texto sin formato pg_dump
genera 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_name
no tiene los privilegios para alterar el esquema public
y plpgsql
.
¿Cómo podría resolver este problema?
Los 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.
Para las personas que usan Google Cloud Platform, cualquier error detendrá el proceso de importación. Personalmente, me encontré con 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.
The input is a PostgreSQL custom-format dump. Use the pg_restore command-line client to restore this dump to a database.
Se produce cuando intentas volcar tu base de datos en un formato de texto no 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 permiso que no he podido solucionar con el comando proporcionado en los documentos de GCP , las sugerencias de este hilo actual o siguiendo los consejos del equipo de Google Postgres here . Que recomienda emitir el siguiente comando:
pg_dump -Fp --no-acl --no-owner -U myusername myDBName > mydump.sql
Lo único que hizo el truco 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 dependientes de GCP.
Actualización:
Es más fácil volcar el archivo comentando extensiones, especialmente dado que algunos volcados pueden ser enormes: pg_dump ... | grep -v -E ''(CREATE/ EXTENSION|COMMENT/ ON)'' > mydump.sql
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
pg_dump ... | grep -v -E ''(CREATE/ EXTENSION/ IF/ NOT/ EXISTS/ plpgsql|COMMENT/ ON/ EXTENSION/ plpgsql)'' > mydump.sql
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 al propietario allí también (originalmente era ''postgres'').
Para resolver el problema, debe asignar los permisos de propiedad adecuados. Pruebe lo siguiente que debería resolver todos los problemas relacionados con permisos para usuarios específicos, pero como se establece en los comentarios, esto no debe utilizarse 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 bajo una cuenta sudo -u postgres psql
y ejecute ALTER ROLE <user-name> Superuser;
declaración.
Tenga en cuenta que esta no es la mejor solución en el servidor de alojamiento multi-sitio, 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 .
Probablemente pueda ignorar los mensajes de error en este caso. Si no se agrega un comentario al esquema público y la instalación de plpgsql (que ya debería estar instalado) no se generarán problemas reales.
Sin embargo, si desea realizar una reinstalación completa, necesitará un usuario con los permisos adecuados. Ese no debería ser el usuario que ejecuta rutinariamente su aplicación, por supuesto.
Respuesta más breve: ignóralo.
Este módulo es la parte de Postgres que procesa el lenguaje SQL. El error generalmente 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 al respecto.
Utilice el usuario de postgres (administrador) para volcar el esquema, recrearlo y otorgar privilegios para usar 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