¿Cómo hacer pg_dump skip extension?

16

Esto está en 9.3 pero puedo recordar cosas similares sucediendo desde 7.x. Entonces creo una base de datos e instalo la extensión plpgsql en ella. Más tarde creo un pg_dump y antes de restaurarlo en databse me aseguro de que también tenga la extensión plpgsql. Luego, al restaurar esto sucede:

pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

Estoy creando un montón de scripts y es bastante importante para mí que pg_restore devuelva 0, por lo que el hecho de que pueda ignorar esto no está haciendo nada bueno. Lo que me desconcierta es que IIRC necesito crear una extensión como usuario maestro de postgres, por lo que no tengo idea de por qué todas estas cosas de EXTENSIÓN terminan en mi basurero. Después de todo, ¿no soy dueño del idioma / extensión?

De todos modos, agradecería cualquier sugerencia sobre cómo deshacerse de esto. Tenga en cuenta que sé cómo funcionan los modificadores -l / -L. Sin embargo, esto parece ser demasiado esfuerzo para corregir un solo comentario de extensión simple.

Jacek Prucia
fuente
3
FWIW, esto se informó el año pasado y se discutió como error # 8695 .
Daniel Vérité

Respuestas:

8

Para cualquiera que busque una solución alternativa, limitarme pg_restorea un esquema específico me ha ayudado a evitar este error. Ver /programming//a/11776053/11819

nfelger
fuente
Todavía tenía problemas con las extensiones cuando usaba la -nbandera
Ligemer
5

Tu puedes hacer

pg_dump ... | grep -v -E '^(CREATE\ EXTENSION|COMMENT\ ON)' >out.sql

es lo que uso para importar a google cloud sql con postgres.

editar: se agregó el cursor 'inicio de línea' para no excluir líneas que contienen este texto literal.

René
fuente
2
eso podría eliminar el registro que contiene ese texto, es poco probable que suceda, pero tendrá un esquema corrupto con restricciones faltantes (ya que se agregan al final de la instantánea). Prefiero un "-" en lugar de eliminar, y también considerando el caso DROP pg_dump | sed 's/DROP EXTENSION/-- DROP EXTENSION/g' | sed 's/CREATE EXTENSION/-- CREATE EXTENSION/g' | sed 's/COMMENT ON EXTENSION/-- COMMENT ON EXTENSION/g'
Elvis Ciotti
2

Use el -Lindicador con pg_restore después de realizar un volcado en un formato de archivo personalizado.

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

Restaure solo los elementos de archivo que se enumeran list-filey restaúrelos en el orden en que aparecen en el archivo. Tenga en cuenta que si los interruptores de filtrado como -no-t se usan con -L, restringirán aún más los elementos restaurados.

list-filenormalmente se crea editando la salida de una -loperación anterior . Las líneas se pueden mover o eliminar, y también se pueden comentar colocando un punto y coma ( ;) al comienzo de la línea. [...]

Referencia: pg_restore (documentación de PostgreSQL 9.3)

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

Aquí puedes ver que lo inverso es cierto:

pg_dump -Fc -f pg.dump db_name
pg_restore -l pg.dump | grep 'COMMENT - EXTENSION' | grep 'plpgsql' > pg_restore.list
pg_restore --use-list pg_restore.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
Bienvenido a DBA.SE. Agradecemos su contribución. La pregunta original es sobre PostgreSQL versión 9.3., Pero su respuesta original hacía referencia a la 9.5. versión. He modificado ligeramente tu respuesta para reflejar eso. Sin embargo, partes de la salida podrían ser específicas de la versión y podrían ser diferentes en la versión 9.3.
John también conocido como hot2use el
0

Para exportar solo el esquema sin ningún otro objeto de la base de datos, puede especificar el nombre del esquema utilizando el parámetro --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Mauricio Sánchez
fuente