Como fazer a extensão pg_dump pular?

16

Esta é a versão 9.3, mas eu me lembro de coisas semelhantes acontecendo desde a 7.x. Então, crio o banco de dados e instalo a extensão plpgsql nele. Posteriormente, crio um pg_dump e antes de restaurá-lo no databse, verifique se ele também possui a extensão plpgsql. Então, ao restaurar isso acontece:

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

Estou criando um monte de scripts e é muito importante para mim que o pg_restore retorne 0, então o fato de eu simplesmente ignorar isso não está adiantando. O que me intriga é que o IIRC eu preciso criar extensão como usuário mestre do postgres, então não tenho idéia do porquê de todo esse material de EXTENSION acabar no meu lixão. Afinal, eu não sou dono do idioma / extensão?

De qualquer forma, eu ficaria grato por qualquer sugestão de como se livrar disso. Observe que estou ciente de como as opções -l / -L funcionam. No entanto, isso parece ser um esforço demais para corrigir apenas um comentário de extensão simples.

Jacek Prucia
fonte
3
FWIW, isso foi relatado no ano passado e discutido como bug # 8695 .
Daniel Vérité

Respostas:

8

Para quem procura uma solução alternativa, a limitação pg_restorede um esquema específico me ajudou a contornar esse bug. Consulte /programming//a/11776053/11819

nfelger
fonte
Eu ainda tinha problemas com extensões quando eu usei o -nflag
Ligemer
5

Você pode fazer

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

é o que eu uso para importar para o google cloud sql com o postgres.

edit: adicionou o cursor de início de linha para não excluir linhas que contenham esse texto literal.

Rene
fonte
2
isso pode remover o registro que contém esse texto, é improvável que isso aconteça, mas você terá um esquema corrompido com restrições ausentes (como elas são adicionadas no final do instantâneo). Prefixo um "-" em vez de removê-lo, e também considerando o 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 17/17
2

Use o -Lsinalizador com pg_restore após fazer um despejo em um formato de arquivo personalizado.

-L - lista de uso =list-file
list-file

Restaure apenas os elementos de arquivamento listados list-filee restaure-os na ordem em que aparecem no arquivo. Observe que, se as opções de filtragem como -nou -tforem usadas com -L, elas restringirão ainda mais os itens restaurados.

list-fileé normalmente criado editando a saída de uma -loperação anterior . As linhas podem ser movidas ou removidas e também podem ser comentadas colocando um ponto-e-vírgula ( ;) no início da linha. [...]

Referência: pg_restore (PostgreSQL Documentation 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

Aqui você pode ver que o inverso é verdadeiro:

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
fonte
Bem-vindo ao DBA.SE. Agradecemos sua contribuição. A pergunta original é sobre o PostgreSQL versão 9.3., Mas sua resposta original foi referente à 9.5. versão. Modifiquei sua resposta levemente para refletir isso. No entanto, partes da saída podem ser específicas da versão e podem ser diferentes na versão 9.3.
John aka hot2use
0

Para exportar apenas o esquema sem outros objetos do banco de dados, você pode especificar o nome do esquema usando o parâmetro --schema

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