Jak zrobić rozszerzenie pg_dump pominąć?

16

To jest na 9.3, ale pamiętam podobne rzeczy, które wydarzyły się od 7.x. Więc tworzę bazę danych i instaluję w niej rozszerzenie plpgsql. Później tworzę plik pg_dump i przed przywróceniem go do bazy danych upewniam się, że ma on również rozszerzenie plpgsql. Następnie po przywróceniu dzieje się:

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

Tworzę mnóstwo skryptów i dla mnie bardzo ważne jest to, że pg_restore zwraca 0, więc fakt, że mogę to zignorować, nie przynosi żadnego efektu. Zastanawiające jest dla mnie to, że IIRC muszę utworzyć rozszerzenie jako użytkownik główny postgres, więc nie mam pojęcia, dlaczego wszystkie te rozszerzenia dotyczące rozszerzenia kończą się na moim zrzutu. W końcu nie jestem właścicielem języka / rozszerzenia?

W każdym razie byłbym wdzięczny za wszelkie sugestie, jak się tego pozbyć. Pamiętaj, że wiem, jak działają przełączniki -l / -L. Wydaje się to jednak zbyt dużym wysiłkiem, aby poprawić tylko jeden prosty komentarz rozszerzenia.

Jacek Prucia
źródło
3
FWIW, zostało to zgłoszone w zeszłym roku i omówione jako błąd # 8695 .
Daniel Vérité,

Odpowiedzi:

8

Dla każdego, kto szuka obejścia, ograniczenie pg_restoredo określonego schematu pomogło mi obejść ten błąd. Zobacz /programming//a/11776053/11819

nfelger
źródło
Nadal miałem problemy z rozszerzeniami, gdy użyłem -nflagi
Ligemer
5

Możesz to zrobić

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

to jest to, czego używam do importowania do Google Cloud SQL z Postgres.

edycja: dodano kursor „początek linii”, aby nie wykluczać wierszy zawierających ten dosłowny tekst.

Rene
źródło
2
może to spowodować usunięcie rekordu zawierającego ten tekst, co jest mało prawdopodobne, ale będziesz mieć uszkodzony schemat z brakującymi ograniczeniami (ponieważ są one dodawane na końcu migawki). Prefiks „-” zamiast usuwania, a także rozważenie sprawy 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

Użyj -Lflagi z pg_restore po zrobieniu zrzutu w niestandardowym formacie pliku.

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

Przywróć tylko te elementy archiwum, które są wymienione list-filei przywróć je w kolejności, w jakiej występują w pliku. Należy pamiętać, że jeśli przełączniki filtrowania takie jak -nlub -tsą używane z -Lnimi, dodatkowo ograniczą przywrócone elementy.

list-filejest zwykle tworzony przez edycję wyników poprzedniej -loperacji. Linie można przenosić lub usuwać, a także można je komentować, umieszczając średnik ( ;) na początku linii. [...]

Odniesienie: pg_restore (Dokumentacja 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

Tutaj możesz zobaczyć, że odwrotność jest prawdą:

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
źródło
Witamy w DBA.SE. Dziękujemy za Twój wkład. Pierwotne pytanie dotyczy PostgreSQL w wersji 9.3., Ale twoja pierwotna odpowiedź dotyczyła wersji 9.5. wersja. Lekko zmodyfikowałem twoją odpowiedź, aby to odzwierciedlić. Jednak części danych wyjściowych mogą być specyficzne dla wersji i mogą różnić się w wersji 9.3.
John aka hot2use,
0

Aby wyeksportować tylko schemat bez żadnych innych obiektów bazy danych, możesz podać nazwę schematu za pomocą parametru --schema

pg_dump --schema=<schema_name> --schema-only <db_name> 
Mauricio Sánchez
źródło