Come fare in modo che pg_dump salti l'estensione?


16

Questo è il 9.3, ma ricordo cose simili accadute dal 7.x. Quindi creo il database e installo l'estensione plpgsql in esso. Successivamente creo un pg_dump e prima di ripristinarlo in databse mi assicuro che abbia anche l'estensione plpgsql. Quindi quando si ripristina ciò accade:

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

Sto creando un sacco di script ed è abbastanza importante per me che pg_restore restituisca 0, quindi il fatto che posso semplicemente ignorare questo non sta facendo nulla di buono. Ciò che mi confonde è che IIRC ho bisogno di creare l'estensione come utente master postgres, quindi non ho idea del perché tutte queste cose di EXTENSION finiscano nella mia discarica. Dopo tutto, non sono il proprietario della lingua / estensione?

Ad ogni modo, sarei grato per qualsiasi suggerimento su come sbarazzarsi di questo. Si noti che sono a conoscenza del funzionamento degli switch -l / -L. Questo tuttavia sembra essere uno sforzo eccessivo per correggere solo un semplice commento di estensione.


3
FWIW, questo è stato segnalato l'anno scorso e discusso come bug # 8695 .
Daniel Vérité,

Risposte:


8

Per chiunque cerchi una soluzione alternativa, limitarsi pg_restorea uno schema specifico mi ha aiutato a aggirare questo errore. Vedi /programming//a/11776053/11819


Avevo ancora problemi con le estensioni quando ho usato la -nbandiera
Ligemer,

5

Tu puoi fare

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

è quello che uso per importare su google cloud sql con postgres.

modifica: aggiunto il cursore 'inizio linea' per non escludere le linee che contengono questo testo letterale.


2
che potrebbe rimuovere record che contengono quel testo, improbabile che accada, ma avrai uno schema danneggiato con vincoli mancanti (poiché vengono aggiunti alla fine dell'istantanea). Prefisso un "-" invece di rimuovere, e anche considerando il 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

Utilizzare il -Lflag con pg_restore dopo aver eseguito un dump in un formato file personalizzato.

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

Ripristina solo gli elementi di archivio elencati list-filee ripristinali nell'ordine in cui compaiono nel file. Si noti che se si utilizzano interruttori di filtro come -no -tvengono utilizzati con -L, limiteranno ulteriormente gli elementi ripristinati.

list-fileviene normalmente creato modificando l'output di un'operazione precedente -l. Le righe possono essere spostate o rimosse e possono anche essere commentate inserendo un punto e virgola ( ;) all'inizio della riga. [...]

Riferimento: pg_restore (Documentazione 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

Qui puoi vedere l' inverso è vero:

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

Benvenuti in DBA.SE. Apprezziamo il tuo contributo. La domanda originale riguarda PostgreSQL versione 9.3., Ma la tua risposta originale faceva riferimento al 9.5. versione. Ho modificato leggermente la tua risposta per rispecchiarla. Tuttavia, alcune parti dell'output potrebbero essere specifiche della versione e potrebbero essere diverse nella versione 9.3.
John aka hot2use,

0

Per esportare solo lo schema senza altri oggetti del database, è possibile specificare il nome dello schema usando il parametro --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.