pg_dump - Error pg_restore de PostgreSQL 9.1 con respecto a PLPGSQL
restore database pg_dump (5)
¿Estás cargando en un DB que fue creado por un usuario diferente? Si es posible, intente restaurar usando el mismo usuario que creó el DB y sus objetos existentes.
Estoy usando Postgres para un proyecto django y actualmente estoy implementando un sistema de copia de seguridad / restauración de base de datos que tan simple como sea posible realiza un pg_dump cuando el usuario hace clic en la copia de seguridad y luego pg_restaura cuando hacen clic en restaurar copia de seguridad.
Todo parece estar bien y dandy hasta que realmente intente realizar el pg_restore, momento en el cual se produce este error:
pg_restore: [archiver (db)] Error de la entrada TOC 3206; 0 0 COMENTAR EXTENSIÓN plpgsql pg_restore: [archiver (db)] no pudo ejecutar la consulta: ERROR: debe ser el propietario de la extensión plpgsql El comando era: COMENTARIO SOBRE LA EXTENSIÓN plpgsql ES ''PL / pgSQL procedural language'';
He investigado qué es plpgsql, y entiendo eso, y con respecto al error, intenté configurar manualmente el "propietario de la extensión" para el usuario que ejecuta el script y es dueño de la base de datos, pero eso no cambió nada, es realmente molesto desde su error en un intento de establecer un comentario de todas las cosas
Todo esto es creado automáticamente por pg_dump, por lo que la línea de comentario no se puede eliminar y no hay indicadores para deshabilitar los comentarios (que yo sepa), así que estoy realmente atascado en cuanto a cómo resolver este problema.
Encontré la siguiente solución en esta página:
http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php
La idea es usar pg_restore -l para listar el contenido del archivo, grep la extensión que el usuario no tiene permiso para restaurar, y usar pg_restore -L para usar esta lista elided al restaurar.
Por ejemplo:
pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements
pg_restore -L ~/restore_elements ~/database.dump
Funciona para mí después de este comando -
Deepak@deepak:~$ sudo -i -u postgres
postgres@deepak:~$ psql
psql (9.3.5)
Type "help" for help.
postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user;
postgres=# GRANT
Parece que pg_restore intenta restaurar algunos datos adicionales que no le pertenecen. Intente agregar -n public
opción -n public
a su línea de comando pg_restore. Le dirá a pg_restore restaurar solo los contenidos del esquema público. Tu línea de comando debería verse como
pg_restore -U username -c -n public -d database_name
Si es posible, te recomiendo que elimines el comentario que no se restaura antes de crear ningún vuelco.
Puedes hacerlo así:
COMMENT ON EXTENSION plpgsql IS null;
Si no desea hacer esto para cada base de datos recién creada, elimine el comentario de la base de datos llamado template1 ( CREATE DATABASE…
copia esta base de datos).
Los volcados creados después de eso deberían restaurarse sin errores.